[LeetCode]--60. Permutation Sequence

简介: 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

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.

[LeetCode]–46. Permutations

前面做过很多个这样类似题,所以很快就能想到找下一个字串。

public String getPermutation(int n, int k) {
        if (n == 1)
            return "1";
        int[] nums = new int[n];
        for (int i = 0; i < n; i++)
            nums[i] = i + 1;
        for (int i = 1; i < k; i++) {
            nums = getNextPermutation(nums);
        }
        String str = "";
        for (int i = 0; i < nums.length; i++) {
            str += nums[i];
        }
        return str;
    }

    public int[] getNextPermutation(int[] nums) {
        int i = nums.length - 1;
        while (i > 0 && nums[i] < nums[i - 1])
            i--;
        int second = Integer.MAX_VALUE, secondIndex = Integer.MAX_VALUE;
        for (int j = nums.length - 1; j >= i; j--)
            if (nums[j] > nums[i - 1] && nums[j] < second) {
                second = nums[j];
                secondIndex = j;
            }
        int temp = nums[i - 1];
        nums[i - 1] = nums[secondIndex];
        nums[secondIndex] = temp;
        Arrays.sort(nums, i, nums.length);
        return nums;
    }

虽然AC了,不过效率实在是很低,我又找到了一个效率很高的,beat88%的算法。

public String getPermutation(int n, int k) {
        StringBuilder sb = new StringBuilder();
        boolean[] used = new boolean[n];

        k = k - 1;
        int factor = 1;
        for (int i = 1; i < n; i++) {
            factor *= i;
        }

        for (int i = 0; i < n; i++) {
            int index = k / factor;
            k = k % factor;
            for (int j = 0; j < n; j++) {
                if (used[j] == false) {
                    if (index == 0) {
                        used[j] = true;
                        sb.append((char) ('0' + j + 1));
                        break;
                    } else {
                        index--;
                    }
                }
            }
            if (i < n - 1) {
                factor = factor / (n - 1 - i);
            }
        }

        return sb.toString();
    }
目录
相关文章
LeetCode 60. Permutation Sequence
集合[1,2,3,...,n]总共包含n的阶乘个独特的排列。
71 0
LeetCode 60. Permutation Sequence
[LeetCode]--73. Set Matrix Zeroes
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. click to show follow up. Follow up: Did you use extra space? A straight forward solution us
978 0
[LeetCode]--71. Simplify Path
Given an absolute path for a file (Unix-style), simplify it. For example, path = “/home/”, =&gt; “/home” path = “/a/./b/../../c/”, =&gt; “/c” click to show corner cases. Corner Cases:
1061 0
|
算法
[LeetCode]--47. Permutations II
Given a collection of numbers that might contain duplicates, return all possible unique permutations. For example, [1,1,2] have the following unique permutations: [ [1,1,2], [1,2,1],
1051 0
[LeetCode]--46. Permutations
Given a collection of distinct numbers, return all possible permutations. For example, [1,2,3] have the following permutations: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2],
1236 0
|
算法
[LeetCode]--39. Combination Sum
Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T. The same repeated number may be chosen from C unlimit
1024 0
[LeetCode]--40. Combination Sum II
Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T. Each number in C may only be used once in the
1287 0
|
算法
[LeetCode]--31. Next Permutation
Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers. If such arrangement is not possible, it must rearrange it as the lowest
1300 0
[LeetCode]--49. Group Anagrams
Given an array of strings, group anagrams together. For example, given: [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”], Return: [ ["ate", "eat","tea"], ["nat","tan"], ["bat"] ] Note
1104 0