力扣46. 全排列
力扣刷题 17

力扣46. 全排列

原题,题目描述:
f874e956-7cc4-4ca4-ab39-10e737eb3ffe.png

思路

经典的回溯题,给一个列表,需要做一个这个列表的全排列。思路就是递归。我们这么思考,比如给列表 [1,2,3],我们使用递归,首先在第一次调用时就已经将元素 1 保留在了函数中,就可以将元素 [2,3]传入下一次调用,以此类推,再在每个函数中加入循环去遍历元素。比如第一次我第一次调用函数传的是元素 1 ,第二次我使用循环传递的是 2 ,第三次是 3 ,进入下一个函数后两个数字又以此类推的循环递归。由此得到 6 个排列结果。
当然这里有个问题,比如我们第一个函数传入元素 2 ,那我们如何在第二次调用函数的时候知道第一次是 2 ?我们可以将元素 2 和元素 1 交换位置,总是在第一个函数中使用数组的第一个元素就可以解决这个问题,逐渐缩短数组。

代码

下面是代码:

class Solution {
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        int len = nums.length;
        if (len == 1) {
            ArrayList<Integer> list = new ArrayList<>();
            list.add(nums[0]);
            res.add(list);
            return res;
        }

        int[] t = new int[len];
        for (int i = 0; i < len; i++) {
            System.arraycopy(nums, 0, t, 0, len);
            int temp = t[0];
            t[0] = t[i];
            t[i] = temp;
            List<List<Integer>> lists = permute2(t);
            for (List<Integer> list : lists) {
                list.add(t[0]);
            }
            res.addAll(lists);
        }
        return res;
    }

    public List<List<Integer>> permute2(int[] nums) {
        int len = nums.length;
        List<List<Integer>> res = new ArrayList<>();
        if (1 == len - 1) {
            ArrayList<Integer> list = new ArrayList<>();
            list.add(nums[1]);
            res.add(list);
            return res;
        }

        int[] t = new int[len - 1];
        for (int i = 0; i < len - 1; i++) {
            System.arraycopy(nums, 1, t, 0, len - 1);
            int temp = t[0];
            t[0] = t[i];
            t[i] = temp;
            List<List<Integer>> lists = permute2(t);
            for (List<Integer> integers : lists) {
                integers.add(t[0]);
            }
            res.addAll(lists);
        }
        return res;
    }
}

时间复杂度应该是O(​n\times n!),空间复杂度O(n),提交打败百分之97

力扣46. 全排列
https://www.than.pw/archives/%E5%8A%9B%E6%89%A346.-%E5%85%A8%E6%8E%92%E5%88%97
作者
than
发布于
更新于
许可