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