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.
分析:求全排列中的第k个项, 先求第k项开头数字。k规范化以0开头表示位置。 k / (n - 1)! 为第一个数字位置,更新k = k % (n - 1)!; k / (n - 2)! 为第二个数字位置,更新 k = k % (n - 2)!。 每次求出一个数位置都是在候选数字中选择,选完候选数字就少一个,可以用hash表来做。
class Solution {
public:
string getPermutation(int n, int k) {
map<int, bool> hash;
int count = 1;
for(int i = 1 ; i <= n; ++i) {
count *= i;
}
string ret = "";
k--;
int i, j;
for(i = 0 ; i < n; i++) {
count = count/(n-i);
int selected = k / count + 1;
for(j = 1; j <= n; j++) {
if(!hash[j]) {
selected--;
if(selected == 0) {
hash[j] = true;
break;
}
}
}
ret += ('0' + j);
k = k % count;
}
return ret;
}
};
也可以用数组代替hash表