给定 n 和 k,求123..n
组成的排列中的第 k 个排列。
样例
对于 n = 3
, 所有的排列如下:
123
132
213
231
312
321
如果 k = 4
, 第4个排列为,231
.
注意
1 ≤ n ≤ 9
分析:可以提前计算好不同的k个数有多少个排列,然后一位一位的确定,比如n=3,k=3的情况下,要确立第一位的时候,后面两个数可以产生2个不同的排列,那么第一位肯定应该是2,如果是1的话,k最多为2,如果是3的话,k最小为5,所以确定第一位是2,然后再用同样方法确定后面的每一位。
代码:
class Solution {
public:
/**
* @param n: n
* @param k: the kth permutation
* @return: return the k-th permutation
*/
string getPermutation(int n, int k) {
int cnt[10];
cnt[0] = 1;
for (int i = 1; i < 10; i++)
cnt[i] = cnt[i - 1] * i;
map<int, bool> m;
string ret = "";
for (int i = 1; i <= n; i++)
{
int t = (k / cnt[n - i]) + (k%cnt[n - i] == 0 ? 0 : 1);
if (i == n)
t = 1;
k -= (t - 1)*cnt[n - i];
int j = 1;
for (; j <= n; j++)
{
if (!m[j])
{
t--;
if (t == 0)
break;
}
}
m[j] = true;
char c = '0' + j;
ret += c;
}
return ret;
}
};