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 };

 

posted @ 2016-08-30 20:54  0_summer  阅读(89)  评论(0)    收藏  举报