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 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.
- Given k will be between 1 and n! inclusive.
Example 1:
Input: n = 3, k = 3 Output: "213"
Example 2:
Input: n = 4, k = 9 Output: "2314"
解题思路:数学问题,对任意一串数字,一共有n!中排列,对每个数字而言,该数字作为第一个数字的排列一共有(n-1)!中排列方式,现在要求第k个排序。
我们用 f[n] 数组记录n!,num固定为123456789,即第一个排列
首位:每个数字作为首位有(n-1)!,那么k/(n-1)!,就可以得到第k个应该是数组中那个数字作为首位。
第二位:num去掉刚刚的首位后,剩余的数字进行排列,有(n-1)!种排列方式,每个数字作为次位有(n-2)!种方式,有k%(n-1)!/(n-2)!即为次位所在num的位置。剩余的位可以由此类推。
class Solution {
public:
string getPermutation(int n, int k) {
string res, num = "123456789";
vector<int>f(n, 1);
for(int i = 1; i < n; ++ i)
f[i] = f[i-1] * i;
-- k;
for(int i = n; i >= 1; -- i){
int j = k / f[i-1];
k %= f[i-1];
res.push_back(num[j]);
num.erase(j, 1);
}
return res;
}
};