46. 全排列

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutations
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

import java.util.ArrayList;
import java.util.List;

class Solution {

    private static void swap(int[] nums, int a, int b) {
        int tmp = nums[a];
        nums[a] = nums[b];
        nums[b] = tmp;
    }

    private static void reverse(int[] nums, int start, int end) {
        while (start < end) {
            swap(nums, start++, end--);
        }
    }

    private static void next(int[] nums) {
        if (nums == null || nums.length <= 1) {
            return;
        }
        int i = nums.length - 2;
        while (i >= 0 && nums[i] >= nums[i + 1]) {
            i--;
        }
        if (i >= 0) {
            int j = nums.length - 1;
            while (nums[i] >= nums[j]) {
                j--;
            }
            swap(nums, i, j);
        }
        reverse(nums, i + 1, nums.length - 1);
    }

    public static List<List<Integer>> permute(int[] nums) {
        int length = nums.length;
        int count = 1;
        for (int i = 1; i <= length; ++i) {
            count *= i;
        }

        List<List<Integer>> ret = new ArrayList<>();

        for (int i = 1; i <= count; ++i) {
            List<Integer> item = new ArrayList<>(nums.length);
            for (int j = 0; j < nums.length; ++j) {
                item.add(nums[j]);
            }
            ret.add(item);
            next(nums);
        }
        return ret;
    }
}
posted @ 2021-12-03 14:53  Tianyiya  阅读(38)  评论(0)    收藏  举报