leetcode-Permutation Sequence-60
输入n,k,求1~n的数的全排列中第k大的排列,其中n<10
暴力做法是先求全排列(递归+交换),然后返回第k大的,但明显题目意图应该不是这样
找规律:
第一轮:假设a[0]=1,后面有 (n-1)!个全排列
第二轮:假设a[0]=2,后面有(n-1)!个全排列
......
因此,d*(n-1)!+m=k
其中d就等于第d轮,也就是找到了第一个元素是a[d],这里整除的情况要处理一下,具体看代码,后面的第1,2,3,....n-1个元素的确定也是这样的规律,每一轮k%=(n-x)!
画个图就理解了
1 class Solution { 2 public: 3 string getPermutation(int n, int k) { 4 vector<int> v; 5 for(int i=1;i<=n;i++) v.push_back(i); 6 string s; 7 int ml=1; 8 for(int i=1;i<=n;i++) ml*=i; 9 for(int i=0;i<n;i++){ 10 ml/=(n-i); 11 int tmp=k/ml; 12 if(k%ml==0) tmp--; 13 s+=v[tmp]+'0'; 14 for(int j=tmp;j<n-1;j++){ 15 v[j]=v[j+1]; 16 } 17 k%=ml; 18 if(!k){ 19 for(int j=n-2-i;j>=0;j--) s+=v[j]+'0'; 20 break; 21 } 22 } 23 return s; 24 } 25 };