【LeetCode刷题笔记】46.全排列

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

示例:输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

  • 回溯+DFS
    依旧是一道经典的回溯题目,具体过程就不在这里详解了,LeetCode里有一篇题解我觉得写的很不错,可以一看回溯算法入门级详解 + 练习(持续更新)
    List<List<Integer>> result = new ArrayList<>();
    public List<List<Integer>> permute(int[] nums){
        List<Integer> numsList = new ArrayList<>();
        for (int num : nums)
            numsList.add(num);
        recur(numsList, new ArrayList<>());
        return result;
    }

    public void recur(List<Integer> nums, List<Integer> temp){
        if (nums.size() <= 0) {
//            依旧是Java的按值传递问题
            result.add(new ArrayList<>(temp));
            return;
        }

        for (int i = 0; i < nums.size(); i++){
//            注意这里选择的方案是将nums用List保存以方便去除掉已经选择过的节点
//            但这种方法即新创建了一个数组空间,又导致在add插入回节点的过程中有O(N)的时间开销
//            解决办法可以设置一个boolean数组,以false或true来代表此节点有没有被选择过
            int num = nums.remove(i);
            temp.add(num);
            recur(nums, temp);
            temp.remove(temp.size() - 1);
            nums.add(i, num);
        }
    }

你可能感兴趣的:(LeetCode,回溯,算法,java,leetcode,数据结构,面试)