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; } };
时间: 2024-10-10 09:25:09