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:
//TLE
/*string getPermutation(int n, int k) {
vector<int> nums;
vector<int> vans;
vector<int> temp;
vector<bool> used(n);
for (int i = 0; i < n; i++) nums.push_back(i + 1);
helper(vans, temp, n, nums, used, k);
string ans;
for (int i = 0; i < nums.size(); i++) ans += (char)('0' + vans[i]);
return ans;
}
void helper(vector<int>& vans, vector<int>& temp, int left, vector<int>& nums, vector<bool>& used, int& k){
if(left == 0){
k--;
if(k == 0) vans = temp;
return;
}
for(int i = 0; i < nums.size(); i++){
if(!used[i]){
temp.push_back(nums[i]);
used[i] = true;
helper(vans, temp, left - 1, nums, used, k);
temp.pop_back();
used[i] = false;
}
}
}*/
string getPermutation(int n, int k) {
int fa[10] = {1};
for(int i = 1; i <= 9; i++){
fa[i] = i * fa[i - 1];
}
string res;
vector<int> nums = {1, 2, 3, 4, 5, 6, 7, 8 ,9};//这句话 重要。,避免了对数字 +1, -1的问题。
for(int i = n; i > 0; i--){
int quotients = (k - 1) / fa[i - 1];
res.push_back('0' + nums[quotients]);//注意: 这里不是res.push_back('0' + nums[quotients + 1]);因为数组是从0开始算的
nums.erase(nums.begin() + quotients);
k = k - quotients * fa[i - 1];
//k = k % fa[n - 1];//注意: 这里不能用k % x,因为上面用的是 k / x.
}
return res;
}
};