给定一个可能具有重复数字的列表,返回其所有可能的子集
注意事项
子集中的每个元素都是非降序的
两个子集间的顺序是无关紧要的
解集中不能包含重复子集
样例
如果 S = [1,2,2],一个可能的答案为:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
Python:
class Solution:
"""
@param S: A set of numbers.
@return: A list of lists. All valid subsets.
"""
# recursion
def subsetsWithDup(self, S):
s = sorted(S)
result = []
self.dfs(s, 0, [], result)
return result
def dfs(self, s, num, tmp, result):
result.append(tmp)
for i in range(num, len(s)):
if i != num and s[i] == s[i-1]:
continue
else:
self.dfs(s, i + 1, tmp + [s[i]], result)
# iteration
def subsetsWithDup(self, S):
result = [[]]
s = sorted(S)
for i in s:
result += [item + [i] for item in result if item + [i] not in result]
return result