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

LeetCode Permutation Sequence

时间:2015-09-30 06:23:08      阅读:146      评论:0      收藏:0      [点我收藏+]

标签:

原题链接在这里:https://leetcode.com/problems/permutation-sequence/

原理是n个数有n!个permutation, 那么n-1个数就有(n-1)!种排列, n可以分成n组,每组有(n-1)!个数.

比如n = 6,那么以1,2,3,4,5,6开头的组合必然是各有(n-1)! = 5! = 120中组合, 若K = 299,那么我们先要求解这个k在第几组,k/(n-1)! = 299/120 = 2,也就是说k应该在第

3组(注意组号从0开始),组数应该从0开始,那么k要-1; 第三组的首个数字应该是3,第一个数字就确定了。

确定第2个数字的时候,注意这个时候,k应该等于k % 120 = 59,为什么要这么算呢,因为每个组有120个数字,

而且k在第三组,那么前两组加起来是240,k在第二次循环的时候,应该是从(5-1)!中确定是属于哪个组,其实就是确定k在第三组中是属于哪个位置。

这个时候59/24 = 2,确定应该是属于第三组,因为在上一步中,3已经用过了,所以这个时候的5个数字是1,2,4,5,6,所以第三组的首个数字是4,依次类推,一直到n个数字全部算完为止。

因为前面的数被拿掉后后面的数字要跟上,所以使用list结构。

AC Java:

 1 public class Solution {
 2     public String getPermutation(int n, int k) {
 3         if(n<=0 || k<=0){
 4             return "";
 5         }
 6         
 7         k--;
 8         int factorial = 1;
 9         List<Integer> ls = new ArrayList<Integer>();
10         for(int i = 1; i<=n; i++){
11             ls.add(i);
12         }
13         for(int i = 1; i<n; i++){
14             factorial *= i;
15         }
16         
17         StringBuilder sb = new StringBuilder();
18         int counter = n-1;
19         while(counter>=0){
20             int index = k/factorial;
21             sb.append(ls.get(index));
22             ls.remove(index);
23             
24             k%=factorial;
25             if(counter != 0){
26                 factorial /= counter;
27             }
28             counter--;
29         }
30         return sb.toString();
31     }
32 }

 

LeetCode Permutation Sequence

标签:

原文地址:http://www.cnblogs.com/Dylan-Java-NYC/p/4847742.html

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