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.
class Solution {
public:
/*algorithm dfs TLE error
*/
void dfs(int n,int k,string &result,int &count,vector<int>&path,vector<int>&accessed){
if(path.size() == n){
++count;
if(count == k){ //find kth
for(int i = 0;i < n;i++)
result.append(1,path[i] + '0');
}
return;
}
for(int i = 1;i <= n;i++){
if(accessed[i])continue;
accessed[i] = 1;
path.push_back(i);
dfs(n,k,result,count,path,accessed);
path.pop_back();
accessed[i] = 0;
if(count == k)return;
}
}
string getPermutation(int n, int k) {
string result;
vector<int>path;
vector<int>visited(n,0);
int count = 0;
dfs(n,k,result,count,path,visited);
return result;
}
};
class Solution {
public:
/*algorithm
n!=(n-1)*n
A[]={1,...,n}
let t:(n-1)!
1)index = (k-1)/t, r=(k-1)%t + 1
2)A remove A[index]
3)k = r,t = t/A.size()
time O(n) ,space O(n)
*/
string getPermutation(int n, int k) {
string s;
vector<int>nums(n,0);
int t = 1; //(n-1)!
for(int i = 1;i <= n;i++){
nums[i-1]=i;
if(i < n)t *= i;
}
while(n){
int i = (k-1)/t;
k = (k-1)%t + 1;
s.append(1,nums[i]+'0');
nums.erase(nums.begin()+i);
n--;
if(n)t /= n;
}
return s;
}
};