您的位置:首页 > 产品设计 > UI/UE

LeetCode 60. Permutation Sequence 全排列的第k个

2018-02-17 21:22 573 查看
求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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: