day29 回溯算法part5 代码随想录算法训练营 491. 非递减子序列

题目:491. 非递减子序列

我的感悟:

  • 难不怕,不行就抄一遍,再默写一遍,多记忆几遍。
  • 加油!!!

理解难点:

  • uset 是本层的, 
  • res 收获的是节点(满足要求的节点),不用return (用了return 是仅仅收集叶子节点的)
  • 判断 的逻辑,是nums[i] 当前的节点和目标的path的区别

代码示例:

class Solution:
    def findSubsequences(self, nums: List[int]) -> List[List[int]]:
        res = []
        self.backtracking(nums,0,[],res)
        return res
    
    def backtracking(self,nums,start_index,path,res):
        # 收获结果,不是到叶子节点收获,是每个节点达到要求就收获
        if len(path) > 1:
            res.append(path[:])
        # 遍历
        uset = set()    # 仅仅只记录本层
        for i in range(start_index,len(nums)):
            # 写跳过的逻辑
            if (path and nums[i] < path[-1]) or (nums[i] in uset):
                continue 
                # 当前nums[i]值小于path[-1] 例如 [4,7] 6就小于7 就跳过.
                # 或者nums[i] 在本层已经出现过,使用过了. 也跳过

            path.append(nums[i])
            uset.add(nums[i])
            self.backtracking(nums,i+1,path,res)
            path.pop()

通过截图:

扩展写法:

资料:

491.递增子序列 

本题和大家刚做过的 90.子集II 非常像,但又很不一样,很容易掉坑里。 

https://programmercarl.com/0491.%E9%80%92%E5%A2%9E%E5%AD%90%E5%BA%8F%E5%88%97.html

视频讲解:https://www.bilibili.com/video/BV1EG4y1h78v

posted @ 2024-02-19 11:22  o蹲蹲o  阅读(5)  评论(0编辑  收藏  举报