class Solution: def subsetsWithDup(self, nums: List[int]) -> List[List[int]]: res = [] cur = [] nums.sort() def backtrack(start): res.append(cur[:]) # if start == len(nums): # return pre = None for i in range(start, len(nums)): if pre == None or pre != nums[i]: cur.append(nums[i]) backtrack(i + 1) pre = cur.pop() backtrack(0) return res
更正确(?)的写法,分清楚树枝和树层之间的关系,使用一个 used 数组,如果当前数字和前一个数字相同,并且 前一个数字已经 used,说明当前层已经用过该数字,需要跳过。
class Solution: def subsetsWithDup(self, nums: List[int]) -> List[List[int]]: res = [] cur = [] used = [False] * len(nums) nums.sort() def backtrack(start): res.append(cur[:]) for i in range(start, len(nums)): if i != 0 and used[i - 1] == False and nums[i] == nums[i-1]: continue cur.append(nums[i]) used[i] = True backtrack(i + 1) used[i] = False cur.pop() backtrack(0) return res