Leetcode 90.子集 II
1 题目描述(Leetcode题目链接)
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
输入: [1,2,2]
输出:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
2 题解
在第78题 子集的基础上先排序,然后在递归的时候加上一个判断语句用来避免重复。
class Solution:
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
nums.sort()
length = len(nums)
retv = []
def backtrack(i, stack, arr):
if i == 0:
retv.append(stack)
return
for j in range(len(arr)):
if j == 0 or arr[j] != arr[j-1]:
backtrack(i-1, stack + [arr[j]], arr[j+1:])
for i in range(1, length):
backtrack(i, [], nums)
return retv + [nums] + [[]]
这个方法好。
# 刚开始我们只有空集一个答案,循环所有可能的数字,每次循环我们对当前答案的每一种情况考虑加入从1到上限次该数字并更新答案即可
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
dic = {}
for i in nums:
dic[i] = dic.get(i, 0) + 1
res = [[]]
for i, v in dic.items():
temp = res.copy()
for j in res:
temp.extend(j+[i]*(k+1) for k in range(v))
res = temp
return res