高级农民
- 积分
- 2260
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2017-5-5
- 最后登录
- 1970-1-1
|
02/14/2019 Day9
LeetCode 60. Permutation Sequence
解题思路: 这题主要是利用等价拆分排序的思想。
1. 首先想到,n个数,总共有n!种情况,第一位有n种情况,每种情况对应一个set,set相互之间有序,每个set有(n-1)!种情况。
2. 那么我们可以根据 k_index / (n-1) !得到我们想要的数在第几个set里面
3. k_index % (n-1)! 可以得到在那个set里面,我们要找第几个数
- class Solution {
- // method 1: 96.03% 100%
- public String getPermutation(int n, int k) {
-
- // time: O(n)
- // space: O(n)
-
- // {1,2,3,4}
- // 1 -> {2,3,4}
- // 2 -> {1,3,4}
- // 3 -> {1,2,4}
- // 4 -> {1,2,3}
- //
- // k = 18 -> k = 17
- // index = k / fact[3] = 2; k = k % fact[3] = 5
- // res = {1,2,4}
-
- // k = 5
- // index = k / fact[2] = 2; k = k % fact[2] = 1
- //. res = {1,2}
-
- // k = 1
- // index = k / fact[1] = 1; k = k % fact[1] = 0
- // res = {1}
-
- // k = 0
- // index = k / fact[0] = 0; k = k % fact[0] = 0
- // res = {}
-
- List<Integer> res = new ArrayList<Integer> ();
- if (n == 0) new String ();
- for (int i = 1; i <= n; i++) {
- res.add(i);
- }
-
- //fact[i] to store i!
- int[] fact = new int[n];
- fact[0] = 1;
- for (int i = 1; i < n; i++) {
- fact[i] = fact[i-1] * i;
- }
-
- k = k - 1;
- StringBuilder sb = new StringBuilder ();
- for (int i = n - 1; i >= 0; i--) {
- int index = k / fact[i];
- k = k % fact[i];
-
- sb.append(res.get(index));
- res.remove(index);
- }
-
- return sb.toString();
- }
-
-
- // // method 2: 15.53% 100%
- // // time: O(n*k)
- // // space: O(n)
-
- // public String getPermutation(int n, int k) {
- // StringBuilder sb = new StringBuilder ();
- // if (n == 0) return sb.toString();
-
- // for (int i = 1; i <= n; i++) {
- // sb.append((char)('0' + i));
- // }
- // for (int i = 1; i < k; i++) {
- // increasePer(sb);
- // }
- // return sb.toString();
- // }
-
- // private void increasePer(StringBuilder sb) {
- // int firstSmall = -1;
- // for (int i = sb.length() - 2; i >= 0; i--) {
- // if (sb.charAt(i) < sb.charAt(i+1)) {
- // firstSmall = i;
- // break;
- // }
- // }
- // // System.out.println("*firstSmall*" + firstSmall);
-
- // if (firstSmall == -1) {
- // reverse(sb, 0, sb.length() - 1);
- // }
-
- // // firstLarge must exists since sb.charAt(firstSmall) < sb.charAt(firstSmall + 1)
- // int firstLarge = -1;
- // for (int i = sb.length() - 1; i >= firstSmall + 1; i--) {
- // if (sb.charAt(i) > sb.charAt(firstSmall)) {
- // firstLarge = i;
- // break;
- // }
- // }
- // // System.out.println("*firstLarge*" + firstLarge);
- // swap(sb, firstSmall, firstLarge);
- // reverse(sb, firstSmall + 1, sb.length() - 1);
- // }
-
- // private void reverse(StringBuilder sb, int i, int j) {
- // while( i < j) {
- // swap(sb, i++, j--);
- // }
- // }
-
- // private void swap(StringBuilder sb, int i, int j) {
- // char temp = sb.charAt(i);
- // sb.setCharAt(i, sb.charAt(j));
- // sb.setCharAt(j, temp);
- // }
- }
复制代码 |
|