题目大意:给出两个数n和k,求出有字符序列1...n组成的序列的第K个排列。1=<n<=9
算法思想:
此题用常规的做法容易超时如字典序法或递归方法。因此根据全排列的性质,3个元素组成的序列有6中排列,4个元素组成的序列有24中排列。。。。当要得到第K个元素时先找到他的开头元素,p=(k-1)/(n-1)!,则由其组成该排列的首元素,后面的操作一次类推。
思想细化为:
1.计算pTable[n]用于存储当前规模排列个数
2.建立一个集合numchar{'1','2',...'n'}
3.计算当前首字符
4.迭代K值 和n值
代码如下:
class Solution {
public:
string getPermutation(int n, int k) {
int pTable[10]={1};
for(int i=1;i<=9;++i){
pTable[i]=pTable[i-1]*i;
}
vector<char> numChar;
for(int i=1;i<=n;++i){
numChar.push_back(i+'0');
}
string res;
while(n>0){
int temp=(k-1)/pTable[n-1];
res+=numChar[temp];
numChar.erase(numChar.begin()+temp);
k=k-temp*pTable[n-1];
--n;
}
return res;
}
};