标签:
原题链接在这里: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 }
标签:
原文地址:http://www.cnblogs.com/Dylan-Java-NYC/p/4847742.html