标签:
/* * 60. Permutation Sequence * 2016-5-8 by Mingyang 纯数学问题 * 虽然看起来思路很简单,但是实现起来却很巧妙。 * 首先我们都很清除,permutation完成再来看第k个是可以的,但也是不高效的 * 那我们现在首先通过k来除以base来确定第一个数字,再利用剩下的recursive来做的话 * 如何去除掉刚刚我们加了的那个数字呢? * 我没有想起来,网上的一个大神用了一个ArrayList来表示所有的n,直接remove掉就好了 */ public String getPermutation(int n, int k) { k--;// to transfer it as begin from 0 rather than 1 List<Integer> numList = new ArrayList<Integer>(); for (int i = 1; i <= n; i++) numList.add(i); int factorial = 1; for (int i = 2; i < n; i++) factorial *= i; StringBuilder res = new StringBuilder(); int times = n - 1; while (times >= 0) { int indexInList = k / factorial; // 决定落在第几个区间 res.append(numList.get(indexInList)); numList.remove(indexInList); k = k % factorial;// 这道题目的说明很清晰,就是k与factorial将决定最终的k在哪里, //那么我每次循环就是不断地更新两个值的变化,那么k在下一个range里面的排位需要模现在的factorial if (times != 0) factorial = factorial / times;// new (n-1)! // 当然,下一个range就更小一轮了,除以times就好了 times--; } return res.toString(); }
标签:
原文地址:http://www.cnblogs.com/zmyvszk/p/5472484.html