leetcode78(子集问题就是求所有结点)90(去重) 491

这篇博客探讨了如何使用递归回溯算法解决寻找数组子集和子序列的问题。针对存在重复元素的情况,进行了特殊处理,确保结果中没有重复的子集。同时,介绍了不同题目对于去重的要求,如子集需要在整个树中去重,而子序列只需在同层去重。代码实现详细解释了算法的每一步,并提供了优化的解决方案。
摘要由CSDN通过智能技术生成
class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        res=[]
        path=[]
        def backtrack(nums,start):
            res.append(path[:])
            if start>=len(nums):#不写也行,因为要遍历整个树。
                return
            for i in range(start,len(nums)):
                path.append(nums[i])
                backtrack(nums,i+1)
                #res.append(path[:])
                path.pop()
        backtrack(nums,0)
        return res
    '''遍历整个树,把结点都记录下来,就是所有子集的集合'''


 90

class Solution:
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        res=[]
        path=[]
        def backtrack(nums,start):
            res.append(path[:])
            for i in range(start,len(nums)):
                if i>start and nums[i]==nums[i-1]:
                    continue
                path.append(nums[i])
                backtrack(nums,i+1)
                path.pop()
        nums=sorted(nums)
        backtrack(nums,0)
        return res
    '''注意同层去重,但是不需要树枝去重。这题是78和40题的整合版。注意同层去重要排序。'''


不可以用sorted去重,因为本身是求递增子集。所以采用map法来记录一下。

class Solution:
    def findSubsequences(self, nums: List[int]) -> List[List[int]]:
        res=[]
        path=[]
        def backtrack(nums,start):
            repeat=[]#用来记录是否同层有重复使用某个值。
            if len(path)>1:#要求子序列是最小长度为2
                res.append(path[:])
                #注意这里不要加return因为我们要取书上所有结点。
            for i in range(start,len(nums)):
                if nums[i] in repeat:#说明重复,跳过
                    continue
                if len(path)>=1:#我们下一步是要把num[i]加入path,在此之前我们要先判断,这个即将加入的数,是不是比path中最后一位小,如果小,跳过
                    if nums[i]<path[-1]:
                        continue
                repeat.append(nums[i])
                path.append(nums[i])
                backtrack(nums,i+1)
                path.pop()
        backtrack(nums,0)
        return res

这几个题都可以不用加return。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值