zoukankan      html  css  js  c++  java
  • [leetcode] 90. 子集 II.md

    90. 子集 II

    78. 子集题的扩展,其中的元素可能会出现重复了

    我们仍沿用78题的代码,稍作改动即可:

    1. 此时需要对nums先排个序,方便我们后面跳过选取相同的子集。
    2. 跳过选取相同的子集。当选取完第i个数时,如果后面的数,和当前数相同,就跳过,不必对其进行递归了。
    class Solution {
        private void dfs(int n, int k, int last, int[] nums, List<Integer> cur, List<List<Integer>> ans) {
            if (k == 0) {
                ans.add(new ArrayList<>(cur));
                return;
            }
            for (Integer i = last + 1; i <= n; i++) {
                cur.add(nums[i - 1]);
                dfs(n, k - 1, i, nums, cur, ans);
                cur.remove(((Integer) nums[i - 1]));
                // 对于后面的数,如果和当前数相同,就跳过。
                while (i > 0 && i < n && nums[i] == nums[i - 1]) i++;
            }
        }
    
        public List<List<Integer>> subsetsWithDup(int[] nums) {
            Arrays.sort(nums);
            List<List<Integer>> ans = new ArrayList<>();
    
            List<Integer> cur = new ArrayList<>();
    
            for (int k = 0; k <= nums.length; k++) {
                dfs(nums.length, k, 0, nums, cur, ans);
            }
    
            return ans;
        }
    }
    
  • 相关阅读:
    strstr 函数的实现
    函数模板与模板函数
    内核态和用户态
    最短路径算法(跟新SPFA,Ford)
    P1042 乒乓球
    P2347 砝码称重
    P1087 FBI树
    P1540 机器翻译
    P1028 数的计算
    P1067 多项式输出
  • 原文地址:https://www.cnblogs.com/acbingo/p/9427832.html
Copyright © 2011-2022 走看看