Given a collection of integers that might contain duplicates, nums, return all possible subsets.
Note: The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,2]
, a solution is:
[ [2], [1], [1,2,2], [2,2], [1,2], [] ]
题目大意:给定一个可能含有重复数字的集合,返回所有可能的子集的集合
解题思路:本题跟之前做过的一道Leetcode78. Subsets非常相似。也是列出所有子集的集合,但是两题不同之处在于这个是升级版,是可能出现重复数字的。解题的方法应该还是用DFS来处理,只不过在处理重复数字上需要一些办法。一开始想到的做法是在深度优先的循环里做一个判断,如果集合中的当前数字跟他的前一个数字是一样的,那就跳过,不把该数字加入到子集中,直接进入循环的下一步。但是在运行的过程中出错了。原因是有可能会出现以下情况,就拿题目给的例子来说吧。如果子集中已有的数字是1,则nums集合中还剩下[2,2],如果按照nums[i]==nums[i-1]就跳出循环的话,在Python中nums[-1]等于该集合的最后一个元素,这种情况下第一个2被跳过,这样就无法出现子集[1,2,2]。后来经过尝试,增加一个判断,不仅是当前数字等于前一个数字,还要当前数字不是剩余数组中的第一个数字,才跳过,如果是第一个数字,就不跳过,这样就不会出现跳过第一个2的情况。
class Solution(object):
def subsetsWithDup(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
A=[]
def dfs(start, length, List):
for i in range(start, len(nums)):
if length == len(nums):
return
if nums[i] == nums[i - 1] and i!=start:
continue
else:
A.append(List + [nums[i]])
dfs(i + 1, length+1, List + [nums[i]])
nums.sort()
if not nums:
return []
else:
A.append([])
dfs(0, 0, [])
return A