zoukankan      html  css  js  c++  java
  • LeetCode90. 子集 II

    ☆☆☆☆思路:回溯 + 剪枝。 如果使用Set去重,不能AC

    class Solution {
        public List<List<Integer>> subsetsWithDup(int[] nums) {
            List<List<Integer>> res = new ArrayList<>();
            Arrays.sort(nums); // 排序
            dfs(nums, 0, new ArrayList<>(), res);
            return res;
        }
        // 举例:[1,2,2]
        // 去重前:[ [],[1],[1,2],[1,2,2],[1,2],[2],[2,2],[2] ]
        // 去重后:[ [],[1],[1,2],[1,2,2],[2],[2,2] ]
        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++) {
                // 和上个数字相等就跳过, 注意是 i > start, 而不是大于0
                // 在一个for循环中,所有被遍历到的数都是属于一个层级的。我们要让一个层级中,必须出现且只出现一个2
                // i > start 可以让同一层级,不出现相同的元素;但允许不同层级之间的重复
                // eg. 如果把所有当前与之前一个元素相同的都砍掉,那么第二个2出现的时候,已经和前一个2相同了。
                if (i > start && nums[i] == nums[i-1]) continue;
                list.add(nums[i]);
                dfs(nums, i + 1, list, res);
                list.remove(list.size() - 1);
            }
        }
    }
  • 相关阅读:
    Dubbo
    支持微服务架构落地的Java框架
    thinkphp6的主要特性
    thinkphp5的主要特性
    RPC
    HTTP1.0 HTTP1.1 HTTP2.0 主要特性对比
    RabbitMQ 生产环境配置详解
    分布式AKF拆分原则
    通过Hystrix了解分布式接口级的高可用
    Python中使用grpc与consul
  • 原文地址:https://www.cnblogs.com/HuangYJ/p/14199100.html
Copyright © 2011-2022 走看看