Skip to content

Latest commit

 

History

History
89 lines (65 loc) · 2.34 KB

0090-subsets-ii.adoc

File metadata and controls

89 lines (65 loc) · 2.34 KB

90. 子集 II

给你一个整数数组 nums,其中可能包含重复元素,请你返回该数组所有可能的 子集(幂集)。

解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

示例 1:

输入:nums = [1,2,2]
输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]

示例 2:

输入:nums = [0]
输出:[[],[0]]

提示:

  • 1 <= nums.length <= 10

  • -10 <= nums[i] <= 10

解题分析

这道题跟 78. Subsets 类似。不一样的地方是要处理重复元素:

{image_attr}

第 4 行新添加的 2 要加到第 3 行的所有解中,而第 3 行的一部分解是旧解,一部分是新解。可以看到,我们黑色部分是由第 3 行的旧解产生的,橙色部分是由新解产生的。

而第 1 行到第 2 行,已经在旧解中加入了 2 产生了第 2 行的橙色部分,所以这里如果再在旧解中加 2 产生黑色部分就造成了重复。

所以当有重复数字的时候,我们只考虑上一步的新解,算法中用一个指针保存每一步的新解开始的位置即可。

如果使用递归回溯来解决这个问题,遇到重复的直接跳过就可以了,因为重复字段已经处理过一次了。

一刷
link:{sourcedir}/_0090_SubsetsII.java[role=include]
二刷
link:{sourcedir}/_0090_SubsetsII_2.java[role=include]
三刷
link:{sourcedir}/_0090_SubsetsII_30.java[role=include]
三刷(优化)
link:{sourcedir}/_0090_SubsetsII_31.java[role=include]