### 题目描述

### 失败教训
一开始我是暴解法,但是也用了递归,从i=2到n,每次递推,遍历上一次返回的ans 数组,将i插入到每一个数字的每一位(包括最前面和最后面)。
举例:
首先插入1;
然后i=2,在1的前面,后面插入2,得到12,21;
i=3, 同理,得到312,132,123,321,231,213;
以此类推...
当n=9时候,速度极慢,跑了30秒(捂脸),其他还行,所以这个思路代码就不放了。
下面谈谈我的另一种比较巧妙地代码思路。
### 解题思路
江苏老高考3+2模式下,理科数学附加最后一题有时候会考这些排列组合知识。
递归嘛,不就是数学上的递推表达式,假设n个数字,有n!排列方式,数字1-n各有(n-1)!个数字,从小到大排序,用除以(n-1)!,取整,就是第一个数字在第几位,从列表删去这个数字。同理,直到得出第n位数字。
### 代码思路(精妙版)
class Solution {
public:
string toString(int num){
int tmp=0;string s="";
while(num){
tmp=num%10;
s = (char)(tmp+'0') + s;
num = num/10;
}
return s;
}
string getPermutation(int n, int k) {
vector<int> ans;
int m=1,t;
string res="";
for(int i=1;i<=n;i++){
m *= i;
ans.push_back(i);
}
--k;//数组下标从0开始
for(int i=n;i>0;i--){
k %= m;
m /= i;
t = k /m;
int num=ans[t];
res += toString(num);
vector<int>::iterator iter = ans.begin();
while(iter != ans.end())
{
if(*iter ==num )
{
iter = ans.erase(iter);
}
else
{
iter++;
}
}
}
return res;
}
};
###运行结果

还是0ms,有点不可思议哈哈
本文介绍了一种高效的算法来解决排列问题,通过递归方法快速找到第k个排列。相较于暴力解法,此方法能够在0ms内解决问题,即使在n=9的情况下也能迅速给出答案。

被折叠的 条评论
为什么被折叠?



