题目
给定一个可能具有重复数字的列表,返回其所有可能的子集
注意事项
子集中的每个元素都是非降序的
两个子集间的顺序是无关紧要的
解集中不能包含重复子集
您在真实的面试中是否遇到过这个题?
Yes
样例
如果 S = [1,2,2],一个可能的答案为:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
挑战
你可以同时用递归与非递归的方式解决么?
标签
递归
思路
基础DFS,加入一个数字判断条件,当数字加入过subset就跳过。
代码
class Solution:
"""
@param: nums: A set of numbers.
@return: A list of lists. All valid subsets.
"""
def __init__(self):
self.res_list = []
def dfs(self, subset, start_index, nums):
self.res_list.append(subset[:])
used = [0 for i in range(-9, 10)]
for i in range(start_index, len(nums)):
if not used[nums[i]]:
used[nums[i]] = 1
subset.append(nums[i])
self.dfs(subset, i + 1, nums)
subset.pop(-1)
def subsetsWithDup(self, nums):
# write your code here
nums.sort()
self.dfs([], 0, nums)
return self.res_list