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.
解题思路:如果对n个数进行全排列效率有点低,但是全排过程中有个递归的过程,如果第一个数确定那么以它开头的数就有(n-1)!
按照此种思路进行解题。
string getPermutation(int n, int k) {
int vi[10]; //
int mul[10] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880}; //0-9的阶乘
if(0 == k || 0 == n) return "";
for(int t = 1; t <= n; t++){
vi[t - 1] = t; //初始化目标数组
}
int deep = 0; //当前开始结点
int ki = 0; //要交换结点的下标
int nn = n;
int tmpK;
k--;
while(k > 0){
ki = k / mul[nn - 1]; //找出要交换的点下标
k -= ki * mul[nn - 1]; //已处理过的变换个数,即跳过了多少个排序方案,还剩下多少要处理
tmpK = vi[ki + deep];
for(int i = ki + deep; i > deep; i--){
vi[i] = vi[i - 1];
}
vi[deep] = tmpK; //交换
deep++;
nn--;
}
string retStr;
for(int t = 0; t < n; t++){
retStr.push_back(vi[t] + '0');
}
return retStr;
}