DFS和回溯专题:全排列 II

    DFS和回溯专题:全排列 II

题目链接: 全排列 II

参考题解 代码随想录

题目描述

在这里插入图片描述

代码纯享版

class Solution {

    public List<List<Integer>> list_all = new ArrayList();
    public List<Integer> list = new ArrayList();
    public int[] res;
    public List<List<Integer>> permuteUnique(int[] nums) {
        Arrays.sort(nums);
        res = new int[nums.length];
        backtrack(nums);
        return list_all;
    }

    void backtrack(int[] nums){

        if(list.size() == nums.length){
            list_all.add(new ArrayList(list));
            return;
        }


        for(int i = 0; i < nums.length; i++){
            if(i > 0 && nums[i] == nums[i - 1] && res[i - 1] == 0){
                continue;
            }
            if(res[i] == 0){
                list.add(nums[i]);
                res[i] = 1;
                backtrack(nums);
                res[i] = 0;
                list.remove(list.size() - 1);
            }
            
        }
    }
}

代码逐行解析版

class Solution {

    public List<List<Integer>> list_all = new ArrayList();
    public List<Integer> list = new ArrayList();
    public int[] res; 

    public List<List<Integer>> permuteUnique(int[] nums) {
        Arrays.sort(nums); //先对数组nums进行sort排序
        res = new int[nums.length]; //数组res用来判断对应位置的数是否用过:0为没用,1为用过
        backtrack(nums);
        return list_all;
    }

    void backtrack(int[] nums){

        if(list.size() == nums.length){ //如果list列表长度与nums数组长度相同
            list_all.add(new ArrayList(list)); //将list添加到list_all
            return;
        }


        for(int i = 0; i < nums.length; i++){

            //剪枝:nums[i]==nums[i-1]而res[i-1]为0,
            //说明同一树层上有两个重复的元素nums[i)和nums[i-1],不可以重复选取      
            if(i > 0 && nums[i] == nums[i - 1] && res[i - 1] == 0){ 
                continue;
            }
            if(res[i] == 0){ //res[i]未被使用
                list.add(nums[i]); //将该数字添加到list列表中
                res[i] = 1; //将该数字标记为已使用过

                backtrack(nums); //递归
                //将列表list的最后一个数字去掉,同时还原标记
                res[i] = 0;
                list.remove(list.size() - 1);
            }
            
        }
    }
}

相关推荐

  1. dfs专题 P1706 排列问题——洛谷(题解)

    2024-04-26 06:58:02       61 阅读
  2. 46. 排列回溯

    2024-04-26 06:58:02       56 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-26 06:58:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-26 06:58:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-26 06:58:02       87 阅读
  4. Python语言-面向对象

    2024-04-26 06:58:02       96 阅读

热门阅读

  1. HCIP-Datacom-ARST必选题库_网络协议【道题】

    2024-04-26 06:58:02       35 阅读
  2. 机器学习中的 K-均值聚类算法及其优缺点

    2024-04-26 06:58:02       37 阅读
  3. Android --- RecycleView

    2024-04-26 06:58:02       39 阅读
  4. 服务器之间传递数据脚本

    2024-04-26 06:58:02       40 阅读
  5. TensorFlow 的基本概念和使用场景

    2024-04-26 06:58:02       35 阅读
  6. Oracle expdp/impdp 及 exp/imp 命令详解

    2024-04-26 06:58:02       40 阅读
  7. Debian常用命令

    2024-04-26 06:58:02       30 阅读
  8. nodejs连接oracle批量更新数据测试

    2024-04-26 06:58:02       28 阅读
  9. Debian常用命令

    2024-04-26 06:58:02       34 阅读
  10. 一个网络空间安全的小游戏

    2024-04-26 06:58:02       34 阅读