一开始用DFS,搜索,结果超时了。后来想想 这种算法确实不好。就想到了下面的算法:
假设n= 5,k = 100;
先考虑第一位数应该是什么,第一位如果是5xxxx,那么前面应该有4!*4 = 96个数,k>96所以第一位确定为5
第二位数,如果是54xxx,那么考虑第二位前面应该有3!*3 = 18个数,k<18+96,考虑53xxx,由此继续……
class Solution {
private:
string ans;
int a[9];
public:
string getPermutation(int n, int k) {
int *pow = new int[n+1];
pow[0] = 1;
for(int i = 1;i<=n;i++)
{
pow[i] = pow[i-1]*i;
}
string ans = "";
bool *isUsed = new bool[n+1];//这里为了方便将他初始化为n+1位
memset(isUsed,false,sizeof(bool)*(n+1));
for(int i = n;i>0;i--)
for(int j = n;j>0;j--)
{
if(!isUsed[j])
{
int count = 0;
for(int m = 1;m<=n;m++)
if(!isUsed[m]&&m<j)
count++;
if(pow[i-1]*count<k)
{
k -= pow[i-1]*count;
ans += (char)(j+'0');
isUsed[j] = true;
break;
}
}
}
return ans;
}
};