码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode-60 Permutation Sequence

时间:2015-05-10 17:11:10      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:

The set [1,2,3,…,n] contains a total of n! unique permutations.

By listing and labeling all of the permutations in order,
We get the following sequence (ie, for n = 3):

  1. "123"
  2. "132"
  3. "213"
  4. "231"
  5. "312"
  6. "321"

 

Given n and k, return the kth permutation sequence.

Note: Given n will be between 1 and 9 inclusive.

 

思路:从高位到低位依次判断各个位的值。比如原始n=4,k=15;

以1为起始:共有6种结果,6<15;

以2为起始:共有6中结果,6+6<15;

以3为起始:共有6中结果,6+6+6>15; 所以第一位是3; 剩余元素从小到大为1,2,4;

第2个元素为1:有2中结果,6+6+2<15;

第2为元素为2:有2种结果,6+6+2+2>15;所以第二位是2,;剩余元素从小打到为1,4;

此时6+6+2=14<15;即问题变成“以3,2为开头,1,4的排列中第一个排列是什么“,显然就是3214,就是我们需要的结果。

代码如下:

public String getPermutation(int n, int k) {
        int total = 1;
        for(int i=2 ;i<=n ;i++) total *= i;
        if(k>total || k<1) return "";
        
        int[] all = new int[n];
        for(int i=0; i<n; i++) all[i] = i+1;
        getPermutation(all, 0, k, total/n);
        
        String result = "";
        for(int i=0; i<n; i++) 
            result+=all[i];
        return result;
    }
    
    public void getPermutation(int[] all, int index , int k, int maxOnce) {
        if(k == 1) return;
        int i=index;
        for(; i<all.length; i++) {
            if(k - maxOnce < 1) break;
            k -= maxOnce;
        }
        
        int tmp = all[i];
        for(int j=i-1; j>=index; j--) {
            all[j+1] = all[j];
        }        
        all[index] = tmp;
        getPermutation(all, index+1, k, maxOnce/(all.length-1-index));
    }

 

LeetCode-60 Permutation Sequence

标签:

原文地址:http://www.cnblogs.com/linxiong/p/4492461.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!