60. Permutation Sequence题解
题目描述:
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.
算法描述:
由题意知:给定参数 n 和 k,构建一个从 1 到 n 的组合(组合示例如题目所述,组合的顺序要求从小到大)。最后返回第 k 个组合。
首先,构建一个数组 v=[1,2,3,……,n] ,我们需要确定第 k 个组合数是什么,这个组合数是由从1到 n,n 个数组合而来,因此需要确定每一位上的数。我们按照从高位到低位的顺序进行确定:ind = (k-1) / func (n-1),ind 表示数组 v 的索引,func 函数用于返回输入参数的阶乘(表示有多少个组合数),通过这样的方法,我们可以得到最高位数。
之后我们需要对 k 和 v 进行更新以便进入下一次循环得到第二位数,k -= ind * func (n-1) 表示下一次用于计算的 k (因为在数组 v 中我们已经提取出了一位数,我们需要根据之前的 ind 索引来确定新的 k ,func (n-1) 表示 n-1 个数的组合)。
最后要对数组 v 进行更新,将取走的那个数用它之后位置的元素代替。
代码:
class Solution {
public:
string getPermutation(int n, int k) {
vector<int> v(n);
for(int i=0; i<n; i++){
v[i]=i+1;
}
string ans;
while(n){
int ind=(k-1)/func(n-1);
ans+=(v[ind]+'0');
k-=ind*func(n-1);
for(int i=ind+1; i<n; i++){
v[i-1]=v[i];
}
v.pop_back();
n--;
}
return ans;
}
int func(int n){
int temp=1;
while(n){
temp=temp*n;
n--;
}
return temp;
}
};