LeetCode:46全排列

java 复制代码
class Solution {
    //盛放所有的组合
    List<List<Integer>> res = new ArrayList<>();
    //盛放单个组合
    List<Integer> path = new ArrayList<>();
    //记录当前数字是否使用过
    boolean[] used;

    public List<List<Integer>> permute(int[] nums){
        used = new boolean[nums.length];
        backtrack(nums);
        return res;
    }
    //回溯函数
    private void backtrack(int[] nums){
        //当前三个数组填满path,装入res
        if(path.size() == nums.length){
            res.add(new ArrayList<>(path));
            return;
        }

        for(int i = 0; i < nums.length; i++){
            //数字已经在盒子中,跳过
            if(used[i]){
                continue;
            }
            //将数字放入path中
            path.add(nums[i]);
            used[i] = true;

            backtrack(nums);
            //将数字取出来
            path.remove(path.size() - 1);
            used[i] = false;
        }
    }
}

这里必须new ArrayList<>(path),使用深拷贝;如果使用res.add(path),后续执行撤销操作的时候就会将已经存入到res中的结果改变了。

相关推荐
纪念 22911 分钟前
C++ 算法基础 (差分)
开发语言·c++·算法
杨逢昌工厂6S管理2 小时前
150-杨逢昌一线现场诊断笔记:越管一线越抵触背后的熵增机理与基准化治理
经验分享·笔记·职场和发展·学习方法
文丑颜不良啊3 小时前
LeetCode2761~2780题目解析
java·leetcode
jyOverQ3 小时前
从零学 JVM(六):垃圾回收算法详解——标记清除、标记复制与标记整理
jvm·算法
严肃小白兔5 小时前
第 06/24 期:神经网络的反向传播算法:从链式法则到梯度计算
人工智能·神经网络·算法
落羽的落羽5 小时前
【C++】C++17的主要特性
linux·服务器·开发语言·c++·算法·机器学习
文丑颜不良啊6 小时前
LeetCode2841~2860题目解析
java·leetcode
【心态好不摆烂】6 小时前
数据结构基础精讲3
数据结构·算法
漂流瓶jz7 小时前
UVA-1613 K度图的着色 题解答案代码 算法竞赛入门经典第二版
算法·深度优先·图论·贪心·aoapc·算法竞赛入门经典·uva