[leetcode] 90. 子集 II.md

Posted ACBingo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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;
    }
}

以上是关于[leetcode] 90. 子集 II.md的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode 90.子集

LeetCode:78. 子集90. 子集 II

Leetcode 90. 子集 II dfs

LeetCode 90. 子集 II

LeetCode(90):子集 II

leetcode 90. 子集 II