这道题目,用康托展开,时间和空间都碾压了100%的c++.
康拓展开其实就是表示一个连续序列,其实也不用连续,给定一个序列,可以很快速的按照字典序,列出所有序列。给出特定序列,快速告诉你它是按照字典序排序是第几个,给出排名,快速输出序列
https://www.cnblogs.com/dacc123/p/8228762.html
c++
class Solution {
public:
int fact[15];
string getPermutation(int n, int k) {
fact[0]=1;
for(int i=1;i<=n;i++)
{
fact[i]=fact[i-1]*i;
}
string s="";
int vis[15];
k--;
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
{
int x = k / fact[n-i-1];
int j;
for( j=1;j<=n;j++)
{
if(vis[j]==0)
{
if(x==0) break;
x--;
}
}
s+=(j+'0');
vis[j]=1;
k%=fact[n-i-1];
}
return s;
}
};