题目连接:Leetcode 060 Permutation Sequence
解题思路:以 Input:n=4,k=9 为例:
- 预处理c数组,c[] = {1, 2, 6, 24}。
- 枚举第一个位置,如果是1,剩下234,有c[3]=6种排序,k=9 > 6,所以第一个位置不是1,并且k=k-6=3。
- 依旧枚举第一个位置,如果是2,剩下134,有c[3]=6种排序,k=3 <= 6,所以此时第一个位置应该是2。
- 现在枚举第二个位置,如果是1,剩下34,有c[2]=2种排序,k=3 > 2,所以此时第一个位置不是1,并且k=k-2=1。
- 依旧枚举第二个位置,如果是3(2在第一个位置),剩下14,有c[2]=2种排序,k=1<=2,所以第二个位置是3。
- 现在枚举第三个位置,如果是1,剩下4,有c[1]=1种排序,k=1<=1,所以第三个位置是1。
- 最后有答案2314
class Solution { public: string getPermutation(int n, int k) { bool* f = new bool[n+1]; int* c = new int[n+1]; c[0] = 1, f[0] = false; for (int i = 1; i <= n; i++) c[i] = c[i-1]*i, f[i] = false; string ans = ""; for (int i = 0; i < n; i++) { int t = 1; while (k > c[n-i-1]) { k -= c[n-i-1]; t++; } for (int j = 1; j <= n; j++) { if (f[j] == false) t--; if (t == 0) { ans += ('0' + j); f[j] = true; break; } } } return ans; } };