解题思路:从头到尾进行数字排列的确定,当前排列数字的序号(0~n-1)应由排列数和剩余排序数字的阶乘共同决定。
题目链接: LeetCode原题目的链接.
// LeetCode 60,第k个排列
class Solution {
public:
string getPermutation(int n, int k) {
vector<int> memo=vector<int>(n);
vector<int> factorial=vector<int>(n+1,1);
char *result=new char[n+1];
int temp=1;
result[n]='\0';
for(int a=1;a<=n;a++){
memo[a-1]=a;
factorial[a]=temp;
temp*=(a+1);
}
for(int a=0;a<n;a++){
int temp=(k-1)/factorial[n-a-1];//从头到尾选择数字,第一个数字取决于后面未选择的数字的排列数
if(k==factorial[n-a]){//剪枝
for(int b=memo.size()-1;b>=0;b--){
result[a++]='0'+memo[b];
memo.erase(memo.begin()+b);
}
break;
}
result[a]='0'+memo[temp];
memo.erase(memo.begin()+temp);
k-=factorial[n-a-1]*temp;
}
return string(result);
}
};