题目链接
直接用暴力回溯的话会超时
所以直接计算每个位置上的数字
class Solution {
public:
string getPermutation(int n, int k) {
int num[n + 1], vis[n + 1];
num[n] = 1;
for (int i = n; i >= 1; i--) { //首先计算阶乘 num[5] = 24表示位置5上的数不变的话,后面的数有24种排列
if (i != n) num[i] = num[i + 1] * (n - i);
vis[i] = 0;
}
string ans = "";
for (int i = 1; i <= n; i++) {
int curk = (k - 1) / num[i]; //curk表上当前位置上应该选第几个数,注意是k-1
k %= num[i]; //还剩余几个数
int cnt = -1;
for (int j = 1; j <= n; j++) {
if (!vis[j] && ++cnt == curk) {
ans += to_string(j);
vis[j] = true;
break;
}
}
if (k == 0) { //k==0时后面直接逆序,比如第24个序列是1 5 4 3 2,因为第一个位置上的数拥有24个序列,所以后面直接逆序
for (int j = n; j >= 1; j--) {
if (!vis[j])
ans += to_string(j);
}
break;
}
}
return ans;
}
};