Permutation Sequence leetcode java

题目

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还有k,在数列 1,2,3,... , n构建的全排列中,返回第k个排列。

题目告诉我们:对于n个数可以有n!种排列;那么n-1个数就有(n-1)!种排列。

那么对于n位数来说,如果除去最高位不看,后面的n-1位就有 (n-1)!种排列。

所以,还是对于n位数来说,每一个不同的最高位数,后面可以拼接(n-1)!种排列。

所以你就可以看成是按照每组(n-1)!个这样分组。

利用 k/(n-1)! 可以取得最高位在数列中的index。这样第k个排列的最高位就能从数列中的index位取得,此时还要把这个数从数列中删除。

然后,新的k就可以有k%(n-1)!获得。循环n次即可。

 同时,为了可以跟数组坐标对其,令k先--。

 

代码如下:

 

 1      public String getPermutation( int n,  int k) {  
 2         k--; // to transfer it as begin from 0 rather than 1
 3          
 4         List<Integer> numList =  new ArrayList<Integer>();  
 5          for( int i = 1; i<= n; i++)
 6             numList.add(i);
 7        
 8          int factorial = 1;    
 9          for( int i = 2; i < n; i++)  
10             factorial *= i;    
11         
12         StringBuilder res =  new StringBuilder();
13          int times = n-1;
14          while(times>=0){
15              int indexInList = k/factorial;
16             res.append(numList.get(indexInList));  
17             numList.remove(indexInList);  
18             
19             k = k%factorial; // new k for next turn
20               if(times!=0)
21                 factorial = factorial/times; // new (n-1)!
22              
23             times--;
24         }
25         
26          return res.toString();
27     } 

 

Reference:

http://blog.csdn.net/linhuanmars/article/details/22028697

http://blog.csdn.net/fightforyourdream/article/details/17483553

http://blog.csdn.net/u013027996/article/details/18405735

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值