这题要注意产生的序列要求是有序的!
如果递归生成排列要做到有序有些困难。所以变生成排列边计数的方法可能比较麻烦。
我们知道N个数字有N!种排列。也就是有N组 的(N-1)!个排列。
对于第k个序列,我们可以知道他是属于N组(N-1)!排列中的哪一组。第i组的排列是交换第0个和第i个数字后对剩下的1到N-1的全排列。
以此类推,每次查找其在第几组子排列中并交换元素。更新k值。如果k为0则说明交换后的序列即为所求序列。
因为要有序,所以交换后需要对剩余元素排序。
class Solution {
public:
string getPermutation(int n, int k) {
vector<int> f(n+1);
f[0]=1;
for(int i=1;i<=n;++i)
f[i] = i*f[i-1];
string s;
for(int i=1;i<=n;++i)
s.push_back('0'+i-0);
if(k>f[n])
return "";
int idx = 0;
int m = n-1;
--k;
while(true){
int i = k/f[m];
k = k%f[m];
char tmp = s[idx];
s[idx] = s[i+idx];
s[i+idx] = tmp;
sort(s.begin()+idx+1,s.end());
if(k==0)
return s;
++idx;
--m;
}
}
};