[leetcode] 46. 全排列(Java)

Posted ACBingo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[leetcode] 46. 全排列(Java)相关的知识,希望对你有一定的参考价值。

46. 全排列

这题我们可以借用31. 下一个排列写的nextPermutation函数来做,稍微改造一下即可

注意要先给nums排个序

class Solution {
    // 当没有下一个排列时return false
    public boolean nextPermutation(int[] nums) {
        if (nums.length == 1) {
            return false;
        }
        int p = -1;
        for (int i = nums.length - 2; i >= 0; i--) {
            if (nums[i] < nums[i + 1]) {
                p = i;
                break;
            }
        }

        if (p != -1) {
            int tmp = nums[p];
            int q = nums.length - 1;
            while (nums[q] <= tmp) {
                q--;
            }

            nums[p] = nums[q];
            nums[q] = tmp;

            reverse(p + 1, nums);
        } else {
//            reverse(0, nums);
            return false;
        }

        return true;
    }


    public void reverse(int k, int[] nums) {
        if (k >= nums.length) return;
        int i = k;
        int j = nums.length - 1;
        while (i < j) {
            int tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
            i++;
            j--;
        }
    }

    public List<List<Integer>> permute(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> ans = new ArrayList<>();
        do {
            List<Integer> tmp = new ArrayList<>();
            for (int num : nums) {
                tmp.add(num);
            }
            ans.add(tmp);
        } while (nextPermutation(nums));
        return ans;
    }
}

以上是关于[leetcode] 46. 全排列(Java)的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode46. 全排列(JAVA简单易懂DFS)

精选力扣500题 第28题 LeetCode 46. 全排列c++ / java 详细题解

LeetCode:全排列46

LeetCode:46. 全排列47. 全排列 II

LeetCode46 回溯算法求全排列,这次是真全排列

[LeetCode] 46. Permutations(全排列)