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 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.
Given k will be between 1 and n! inclusive.
Example 1:
Input: n = 3, k = 3
Output: "213"
Example 2:
Input: n = 4, k = 9
Output: "2314"
解:首先类似全排列题,尝试使用回溯法
class Solution {
public:
string getPermutation(int n, int k) {
vector<int> vis(n+1,0);
string res = "";
int num = 0 ;
helper(vis,res,k,num);
return res;
}
bool helper(vector<int> &vis,string &res,int k,int &num)
{
if(res.size() == vis.size()-1)
{
num++;
if(num == k)
return true;
else
return false;
}
for(int i = 1;i < vis.size();i++)
{
if(vis[i])
continue;
vis[i] = 1;
res += (i + '0');
bool next = helper(vis,res,k,num);
if(next) return true;
res.pop_back();
vis[i] = 0;
}
return false ;
}
};
然后优化后的方法:
class Solution {
public:
string getPermutation(int n, int k) {
string res = "";
vector<int> mm(n+1,0);
helper(res,mm,n,k);
return res;
}
void helper(string &res,vector<int> & table,int n,int k)
{
int len = res.size();
if(len == n)
return;
int count = caluate(n - len -1);
for(int i = 1;i <= n;i++)
{
if(table[i])
continue;
if(count > 0 && count < k)
{
k -= count;
continue;
}
res += (i + '0');
table[i] = 1;
helper(res,table,n,k);
}
}
int caluate(int n)
{
int res = 1;
while(n > 0)
{
res = res*n;
n--;
}
return res;
}
};