给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/subsets-ii
首先可以看看前面的子集I
然后再看看组合总数到组合总数II的一个思路转变,这里简单说一下。最本质的问题就是进行树的裁剪,在子集I中,我们得到的是一个完全生长的树,但是如果有重复的话,横向来说如果这个数字在前面出现过,那么一定是会再次造成重复的,所以进行一个剪枝,如果不是第一次出现,那么我们就直接跳过它,不对它建树。
下面贴出代码,与子集I一个较大的改动就是,这个数组需要提前排序来保证剪枝的正确性。
class Solution:
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
result = []
def DFS(stop, memo):
'''
:param path: 可以选择的节点
:param memo: 当前走过的节点
:return: 空
'''
for i in range(stop, l):
if i > stop and nums[i] == nums[i-1]:
continue
if nums[i] == []:
result.append(memo)
continue
DFS(i + 1, memo + [nums[i]])
nums.sort()
nums = nums + [[]]
l = len(nums)
DFS(0, [])
return result