zoukankan      html  css  js  c++  java
  • LeetCode78. 子集

    ☆☆☆思路:回溯算法。注意对比区分这三道题:求排列、求组合、求子集。

      求组合 和 求子集 方法的对比:

        更新res的位置不同:求组合时,res 的更新是当树到达底端时;而求子集,res的更新是树上每一个节点,走过的路径都是子集的一部分。

      求组合  和 求排列 方法的对比:

        树的形状不同:排列问题的树比较对称,而组合问题的树越靠右节点越少。

        是否讲究顺序:组合问题不讲究顺序(即 [2, 2, 3] 与 [2, 3, 2] 视为相同列表),需要按照某种顺序搜索。而排列问题,讲究顺序(即 [2, 2, 3] 与 [2, 3, 2] 视为不同列表),需要记录那些数字已经使用过。

        代码中的体现:组合问题从当前位置往后搜索,排除了当前位置之前的数字。而排列问题每次都需要从头寻找,需要用vis数组记录访问过的元素。

    代码1(回溯常规写法):

    class Solution {
        public List<List<Integer>> subsets(int[] nums) {
            List<List<Integer>> res = new ArrayList<>();
            dfs(nums, 0, new ArrayList<>(), res);
            return res;
        }
        // 以[1,2,3]为例,搜索添加顺序为
        // [[],[1],[1,2],[1,2,3],[1,3],[2],[2,3],[3]]
        private void dfs(int[] nums, int start, List<Integer> list, List<List<Integer>> res) {
            // 走过的所有路径都是子集的一部分,所以都要加入到集合中
            res.add(new ArrayList<>(list));
            for (int i = start; i < nums.length; i++) {
                list.add(nums[i]);
                dfs(nums, i + 1, list, res);
                list.remove(list.size() - 1);
            }
        }
    }

    代码2(回溯做选择):

    class Solution {
        public List<List<Integer>> subsets(int[] nums) {
            List<List<Integer>> res = new ArrayList<>();
            dfs(nums, 0, new ArrayList<>(), res);
            return res;
        }
        // 以[1,2,3]为例,搜索添加顺序为
        // [ [1,2,3],[1,2],[1,3],[1],[2,3],[2],[3],[] ]
        private void dfs(int[] nums, int index, List<Integer> list, List<List<Integer>> res) {
            if (index == nums.length) {
                res.add(new ArrayList<>(list));
                return;
            }
            // 选择当前位置
            list.add(nums[index]);
            dfs(nums, index + 1, list, res);
            list.remove(list.size() - 1);
            // 不选择当前位置
            dfs(nums, index + 1, list, res);
        }
    }
  • 相关阅读:
    python之路_django入门项目(老师表)
    python之路_django入门项目(学生表)
    python之路_初识django框架
    python之路_前端基础之Bootstrap JS
    python之路_前端基础之Bootstrap 组件
    python之路_前端基础之Bootstrap CSS
    python之路_登录验证及表格增删改作业
    Spring Boot CLI安装
    Spring Boot 所提供的配置优先级顺序
    Intellij IDEA 14.x 中的Facets和Artifacts的区别
  • 原文地址:https://www.cnblogs.com/HuangYJ/p/14199098.html
Copyright © 2011-2022 走看看