给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。
按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下:
给定 n 和 k,返回第 k 个排列。
说明:
示例 1:
输入: n = 3, k = 3
输出: "213"
示例 2:
输入: n = 4, k = 9
输出: "2314"
提示:
这道题我一上来使用了backtracking的方法依次构造出排列数,当然结果不出所料的TLE了。实际上,仔细观察这些数字,我们还是不难发现一些规律的。
假设有四位数字{1, 2, 3, 4},那么他们能够产生的排列数是什么呢?
其实就是选定第一位数字后,其他剩下的数字进行排列组合,就能求出以该数字打头的所有排列组合。想必已经能发现一些规律了,我们干脆再举一个具体的例子,比如我们现在想要找第14个数,那么由于14 = 6 + 6 + 2。因此第一个数打头的是3,然后再求{1, 2, 4}中第二个排列组合数,答案是"142"。所以最终答案就是"3142"啦。
这里有一些问题是需要我们注意的:
1 class Solution{ 2 public: 3 string getPermutation(int n,int k){ 4 vector<int> permutation(n+1,1); 5 for(int i=1;i<=n;i++){ 6 permutation[i]=permutation[i-1]*i; 7 } 8 vector<char> digits={‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘}; 9 int num=n-1; 10 string res; 11 while(num){ 12 int t=(k-1)/(permutation[num--]); 13 k=k-t*permutation[num+1]; 14 res.push_back(digits[t]); 15 digits.erase(digits.begin()+t); 16 } 17 res.push_back(digits[k-1]); 18 return res; 19 } 20 };
原文:https://www.cnblogs.com/kexinxin/p/10163042.html