【题目描述】
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可能会很大,直接用next_permutation函数来做,结果TLE了,看discuss找到了一种思路:
以1开头的序列有(n-1)!,以2开头的序列有(n-1)!......若确定了开头两个数字为1和2的序列则有(n-2)!,以此类推,那么我们可以通过依次确定第一个元素、第二个元素,直至最后一个。
【代码】
class Solution {
public:
string getPermutation(int n, int k) {
string dic(n,0);
iota(dic.begin(),dic.end(),'1');
vector<int> vec(n,1);
for(int i=n-3;i>=0;i--){
vec[i]=vec[i+1]*(n-1-i);
}
string ans;
k--;
for(int i=0;i<n;i++){
int cnt=k/vec[i];
k=k%vec[i];
ans=ans+dic[cnt];
dic.erase(next(dic.begin(),cnt));
}
return ans;
}
};
介绍了一种高效算法来找出从1到n的所有唯一排列中的第k个排列序列。该算法通过数学方法避免了全排列搜索,确保即使对于较大的n和k也能快速找到答案。

被折叠的 条评论
为什么被折叠?



