90. 子集 II

https://leetcode-cn.com/problems/subsets-ii/

解法一:

类似78.子集,由于数组存在重复,需要在其基础上加上去重条件。

类似于40.组合总和 II的去重判断,先排序,然后将同一层递归的重复数跳过,不同层则不需要跳过。

class Solution:
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        self.res = []
        tmpList = []
        nums.sort()
        for i in range(len(nums)+1):  #len+1轮循环,每次输出长度为i的所有组合
            self.backtrack(nums, tmpList, i, 0)
        return self.res

    def backtrack(self, nums, tmpList, k, start):
        if len(tmpList) == k:
            self.res.append(list(tmpList))
        for i in range(start, len(nums)):    #tmp的修改直接写在递归里
            if i-1 >= start and nums[i-1] == nums[i]:    #跳过同一层递归的重复数字
                continue
            self.backtrack(nums, tmpList+[nums[i]], k, i + 1)

最后更新于