回溯
class Solution {
public:
string getPermutation(int n, int k) {
int nums[n];
for(int i=0;i<n;i++) {nums[i]=i+1;}//cout<<nums[i];}
// cout<<endl;
vector<string> res;
string out;
DFS(res,nums,out,0,n);
// for(int i=0;i<res.size();i++) cout<<res[i]<<' ';
return res[k-1];
}
void DFS(vector<string> &res,int nums[],string out,int depth,int n){
if(depth==n) res.push_back(out);
else{
for(int i=depth;i<n;i++){
swap(nums[depth],nums[i]);
sort(nums+depth+1,nums+n);
DFS(res,nums,out+char(nums[depth]+'0'),depth+1,n);
sort(nums+depth,nums+n);
//for(int i=0;i<n;i++) {cout<<nums[i];}
// cout<<endl;
}
}
}
};
上述方法超出时间、空间限制,所以该题需要找出规律直接输出答案。代码如下:
class Solution {
public:
string getPermutation(int n, int k) {
string res;
string num="123456789";
vector<int> f(n,1);//阶乘列表0!->n-1!
for(int i=1;i<n;i++) f[i]=f[i-1]*i;//求阶乘
--k;
for(int i=n;i>=1;i--){
int j=k/f[i-1];
k%=f[i-1];
res.push_back(num[j]);
num.erase(j,1);
}
return res;
}
};