写了一个挫的,超时了。
class Solution {
public:
string res="";
string getPermutation(int n, int k) {
if(n<=0||k<=0) return res;
vector<char> num;
for(int i=1;i<=n;i++)
{
num.push_back('0'+i);
}
int count=0;
per(num,0,k,count);
return res;
}
void per(vector<char> & num,int begin,int k,int & count){
if(begin==num.size()-1) {
count+=1;
if(count==k)
for(char c:num)
res+=string(1,c);
return;
}
int id=begin;
while(id<num.size() && count < k){
swap(num[id],num[begin]);
vector<char> save(num);
sort(num.begin()+begin+1,num.end());
per(num,begin+1,k,count);
swap(save[begin],save[id]);
num=save;
id++;
}
return;
}
};
可以用计数的方法,比如1234,找到第17个,数组下标是16,第一个位置的数字是谁呢?后面有3个数全排列个数是6,16/6=2,也就是数字3,将数字3从待选字符串中移出,剩余124,接着找下一个数字,后面还有2个数字全排列是2,16%6=4,4/2=2,下标对应下一个数字就是4,剩余待选字符串更新为12,更新4/2=0,下标对应下一个数字就是1,接着查找下一个数字,后面只剩1个数字,全排列就是1,0%0=0,0/1=0,下标对应数字就是1,至此,循环结束。
class Solution {
public:
string res="";
string getPermutation(int n, int k) {
if(n<=0||k<=0) return res;
string num="123456789";
vector<int> jc(n,1);
for(int i=1;i<n;i++){
jc[i]=jc[i-1]*i;
}
k=k-1;
for(int i=n;i>=1;i--){
int j = k/jc[i-1];
res+=num[j];
k=k%jc[i-1];
num.erase(j,1);
}
return res;
}
};