题目分析:
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。如:
输入: [1,2,2]
输出: [[2],[1],[1,2,2],[2,2],[1,2],[]]
解题思路:(两种解法)
一、这个题可以按照【LeetCode】78. Subsets的方法一递归解决(加一个当前元素是否在res里面的判断),过程及其思路请参考【LeetCode】78. Subsets解法一
二、还有一种方法按照【LeetCode】78. Subsets的方法二循环解决(加一个当前元素是否与上一个元素相同的判断),过程及其思路请参考【LeetCode】78. Subsets解法二
测试代码1:(Runtime: 60 ms, faster than 18.96% )
class Solution:
def subsetsWithDup(self, nums: list) -> list:
res = []
nums.sort()
def dfs(k, start, out):
if len(out) == k and out not in res:
res.append(list(out))
return
i = start
while i < len(nums):
if k - len(out) > len(nums) - i:
break
out.append(nums[i])
dfs(k, i + 1, out)
out.pop()
i += 1
for i in range(len(nums)):
dfs(i, 0, [])
res.append(nums)
return res
print(Solution().subsetsWithDup(nums = [1,2,2])) #提交时请删除该行
测试代码2:(Runtime: 44 ms, faster than 87.81% )
class Solution:
def subsetsWithDup(self, nums):
nums.sort()
result = [[]]
prev_number = None
for num in nums:
if num == prev_number:
r = range(just_added, len(result))
else:
r = range(len(result))
just_added = len(result)
result += [result[i] + [num] for i in r]
prev_number = num
return result
print(Solution().subsetsWithDup(nums = [1,2,2])) #提交时请删除该行