求n位数的第k个全排列
利用 n个数字的全排列为n!
我们从第一个开始选
假设n =3。k=5
"123"
"132"
"213"
"231"
"312"
"321"
我们要确定第一位数是什么。
我们知道2的阶乘是 2
即每次跨越2个。
所以(5-1)/2=2
即我们跨越了2个 2
则所选数字为 第3个可选数字(用vis去查找可选数字)
注意最后一个数字要单独去找。
class Solution {
public:
string getPermutation(int n, int k) {
int num[11], vis[11], i, j, index;
memset(vis,0,sizeof(vis));
num[0] = 1;
for(i = 1;i <= 9; i++){
num[i] = num[i-1] * i;
}
num[1] = 1;
string ans;
i = n-1;
while(i > 0){
index = (k-1)/num[i];
k = k - index * num[i];
for(j = 1;j <= n;j++){
if(!vis[j]){
if(index == 0)
break;
index--;
}
}
ans += j + '0';
vis[j] = 1;
i--;
}
for(j = 1;j <= n;j++)
if(!vis[j])
break;
ans += j + '0';
return ans;
}
};