leetcode-90-子集②

题目描述:

 

方法一:回溯

class Solution:
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        if not nums:
            return []
        n = len(nums)
        res = []
        def backtrack(i,temp):
            if temp not in res:
                res.append(temp)
            for j in range(i,n):
                backtrack(j+1,temp+[nums[j]])
        backtrack(0,[])
        return res

 另:优化

class Solution:
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        res = []
        n = len(nums)
        nums.sort()
        def helper(idx, tmp):
            res.append(tmp)
            for i in range(idx, n):
                if i > idx and nums[i] == nums[i-1]:
                    continue
                helper(i+1, tmp + [nums[i]])
        helper(0, [])
        return res

方法二:迭代

class Solution:
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        if not nums: return []
        nums.sort()
        res = [[]]
        cur = []
        for i in range(len(nums)):
            if i > 0 and nums[i - 1] == nums[i]:
                cur = [tmp + [nums[i]] for tmp in cur]
            else:
                cur = [tmp + [nums[i]] for tmp in res]
            res += cur
        return res

 

posted @ 2019-07-11 17:46  oldby  阅读(162)  评论(0编辑  收藏  举报