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):
"123""132""213""231""312""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
原文地址:http://blog.csdn.net/keyyuanxin/article/details/46581243