码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode_60_Permutation Sequence

时间:2015-06-21 14:34:43      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:array   leetcode   c++   

Permutation Sequence

欢迎大家阅读参考,如有错误或疑问请留言纠正,谢谢技术分享


The set [1,2,3,…,n] contains a total of n! unique permutations.

By listing and labeling all of the permutations in order,
We get the following sequence (ie, for n = 3):

  1. "123"
  2. "132"
  3. "213"
  4. "231"
  5. "312"
  6. "321"

Given n and k, return the kth permutation sequence.

Note: Given n will be between 1 and 9 inclusive.


分析:

1、如果使用next_permutation方法实现,会超时

2、本题可采用康托编码实现 (适用范围:没有重复元素的全排列)

简单分析——康托编码(适用范围:没有重复元素的全排列)

适用范围:没有重复元素的全排列

算法:康托编码: 全排列的解码,下面举例说明
如何找出第16个(按字典序的){1,2,3,4,5}的全排列?
1. 首先用16-1得到15
 
2. 用15去除4! 得到0余15
 
3. 用15去除3! 得到2余3
 
4. 用3去除2! 得到1余1
 
5. 用1去除1! 得到1余0
 
有0个数比它小的数是1,所以第一位是1
 
有2个数比它小的数是3,但1已经在之前出现过了所以是4
 
有1个数比它小的数是2,但1已经在之前出现过了所以是3
 
有1个数比它小的数是2,但1,3,4都出现过了所以是5
 
最后一个数只能是2


//方法一:康托编码
class Solution {
public:
    string getPermutation(int n, int k) {
        string str(n, '0'); //必须给初值
        string res(n, '0');
        for(int i = 0; i < n; i++)
            str[i] += i+1; //str.append(i+1);这种方式会报int错
            
        for(int i = 0; i < n; i++)//依次计算排列的每个位
        {
            int tmp = factorial(str.size() - 1);
            int m = (k - 1) / tmp;
            res[i] = str[m];
            str.erase(m, 1);
            k -= m * tmp;//更新k,其实就是上面m的(k - 1) % tmp;
        }
        return res;
    }
    
    //求正整数n的阶乘
    int factorial(int n)
    {
        int sum = 1;
        for(int j = 2; j <= n; j++)
            sum *= j;
        return sum;
    }
};


//方法二:封装函数
class Solution {
public:
    string getPermutation(int n, int k) {
        string str(n, '0'); //必须给初值
        string res(n, '0');
        for(int i = 0; i < n; i++)
            str[i] += i+1; //str.append(i+1);这种方式会报int错
            
        kth_Permutation(n, k, str, res);
        return res;
    }
    
    string kth_Permutation(int n, int k, string& str, string& res)
    {
        for(int i = 0; i < n; i++)//依次计算排列的每个位
        {
            int tmp = factorial(str.size() - 1);
            int m = (k - 1) / tmp;
            res[i] = str[m];
            str.erase(m, 1);
            k -= m * tmp;//更新k,其实就是上面m的(k - 1) % tmp;
        }
        return res;
    }
    
    //求正整数n的阶乘
    int factorial(int n)
    {
        int sum = 1;
        for(int j = 2; j <= n; j++)
            sum *= j;
        return sum;
    }
};





leetcode_60_Permutation Sequence

标签:array   leetcode   c++   

原文地址:http://blog.csdn.net/keyyuanxin/article/details/46581243

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!