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:
string getPermutation(int n, int k) {
string result;
int table[10] = {1};
for (int i = 1; i <= 9; ++i) {
table[i] = table[i-1] * i;
}
if (k > table[n] || k < 1) {
return result;
}
string sequence;
for (int i = 1; i <= n; ++i) {
sequence.push_back('0' + i);
}
return getPermutationUtil(table, sequence, 0, n - 1, k);
}
string getPermutationUtil(int *table, string &source, int start, int end, int k) {
if (k == 1) {
return source;
}
int i;
for (i = 1; table[i] < k; ++i);
--i;
int multi = k / table[i];
k %= table[i];
if (k == 0) {
--multi;
k = table[i];
}
swap(source, end - i, end - i + multi);
sort(source.begin() + end - i + 1, source.end());
return getPermutationUtil(table, source, end - i + 1, end, k);
}
void swap(string &str, int i, int j) {
char tmp = str[i];
str[i] = str[j];
str[j] = tmp;
}
};