The set [1,2,3,…,n] contains a total of n! unique permutations.
By listing and labeling all of the permutations in order,
We get the following sequence (ie, for n = 3):
“123”
“132”
“213”
“231”
“312”
“321”
Given n and k, return the kth permutation sequence.
Note: Given n will be between 1 and 9 inclusive.
思路:暴力搜索法。
之前写过一个nextPermutation的题目,这里可以直接调用k-1次即可,甚至可以直接调用C++中STL自带的函数next_permutation(s.begin(),s.end()).
还有一种效率更高的康托编码,很神奇,可以直接找到答案,不用搜索所有情况。
class Solution {
public:
string getPermutation(int n, int k) {
string s(n,'0');
for(int i=0;i<n;i++)
s[i]+=i+1;
for(int i=0;i<k-1;i++)
nextPermutation(s);
return s;
}
void nextPermutation(string &nums) {
int k=-1,n=nums.size();
for(int i=n-2;i>=0;i--){
if(nums[i]<nums[i+1]){
k=i;
break;
}
}
if(k==-1){
reverse(nums.begin(),nums.end());
return;
}
int l=-1;
for(int i=n-1;i>k;i--){
if(nums[i]>nums[k]){
l=i;
break;
}
}
swap(nums[k],nums[l]);
reverse(nums.begin()+k+1,nums.end());
}
};
class Solution {
public:
string getPermutation(int n, int k) {
string s(n,'0');
string result;
for(int i=0;i<n;i++)
s[i]+=i+1;
return kth_permutation(s,k);
}
private:
int factorial(int n)
{
int result=1;
for(int i=1;i<=n;i++)
{
result*=i;
}
return result;
}
string kth_permutation(string seq,int k)
{
int n=seq.size();
string S=seq;
string result;
int base=factorial(n-1);
k--;
for(int i=n-1;i>0;k%=base,base/=i,i--)
{
result.push_back(S[k/base]);
string::iterator a=S.begin()+k/base;
S.erase(a);
}
result.push_back(S[0]);
return result;
}
};