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.
分析:可以一个一个找next permulation 不过会超时
class Solution {
private:
void getBigger(vector<int> &numbers){
int pos = numbers.size() - 1;
while(numbers[pos - 1] > numbers[pos])
pos--;
pos--;
int xpos = numbers.size() - 1;
while(numbers[xpos] < numbers[pos])
xpos--;
int x = numbers[xpos];
int t = numbers[pos];
numbers[pos] = numbers[xpos];
numbers[xpos] = t;
int i = pos + 1, j = numbers.size() - 1;
while(i < j){
t = numbers[i];
numbers[i] = numbers[j];
numbers[j] = t;
i ++;
j --;
}
}
public:
string getPermutation(int n, int k) {
vector<int> numbers(n);
for(int i = 1; i <= n; i++){
numbers[i - 1] = i;
}
for(int i = 1; i < k; i++)
getBigger(numbers);//,printVector<int>(numbers);
string ans;
for(auto x : numbers){
char ch[25];
sprintf(ch,"%d",x);
ans += string(ch);
}
return ans;
}
};
class Solution {
private:
int getJieCheng(int m){
int ans = 1;
for(int i = 1; i <= m;i ++){
ans *= i;
}
return ans;
}
public:
string getPermutation(int n, int k) {
vector<int> numbers;
for(int i = 1; i <= n; i++)
numbers.push_back(i);
string ans;
for(int m = n - 1; m >= 0; m--){
int l = getJieCheng(m);
int i = 0;
while(k > l){
k -= l;
i++;
}
char ch[10];
sprintf(ch, "%d", numbers[i]);
ans += string(ch);
numbers.erase(numbers.begin() + i);
}
return ans;
}
};