https://leetcode.cn/problems/subsets-ii/
给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
示例 1:
输入:nums = [1,2,2]
输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]
class Solution:
def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
# 回溯法三部曲
# 1、递归函数的返回值以及参数
# 2、确定终止条件
# 3、单层递归(搜索)逻辑
# 元素重复不可复选(排序+剪枝)
from copy import deepcopy
path, res, n = [], [], len(nums) # 子集组合排列回溯三剑客
nums.sort() # sort的目的是让相同数字排在一起,好去重,记住:有重复先排序
def backtrack(start):
res.append(copy.deepcopy(path)) # 或者 res.append(path[:])
for i in range(start, n):
if i > start and nums[i] == nums[i - 1]:
continue
path.append(nums[i]) # 做选择
backtrack(i + 1) # 进入下一层
path.pop() # 取消选择
backtrack(0)
return res