算法描述:
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, forn = 3
):
"123"
"132"
"213"
"231"
"312"
"321"
Given n and k, return the kth permutation sequence.
题目来自此处
解题思路:
这题目不用写出n以内数字的全排列(其实不会写),因为第几个全排列与它排第几有一定的数学联系。
可以把一整个全排列按其第一个、第二个….数字分成一组组,那么
k/(n−1)!
可以得到该数字在当前这批数字内排第几位。然后存储一个从小到大1~n
的数组,在每次循环中从这个数组中得到索引的数字,得到后删去,每次索引中第几个数字跟数组中对应的数字是刚好对应的。
class Solution {
public:
string getPermutation(int n, int k) {
string result = "";
vector<int>nums;
nums.push_back(1);
for(int i=1;i<=n;i++){
nums.push_back(i);
}
k--;
while(n){
int index = (double)k/factorial(n-1)+1;
result += (nums[index]+'0');
nums.erase(nums.begin()+index);
k -= factorial(n-1)*(index-1);
n--;
}
return result;
}
int factorial(int n){
if(n <= 1) return 1;
else return n*factorial(n-1);
}
};
这个算法的时空复杂度都是 O(n) 。