Leetcode 337.打家劫舍3(717)

题目

26年7月17日(首刷看解)

Go 复制代码
func rob(root *TreeNode) int {
   steal,notsteal:=dfs(root)
   return max(steal,notsteal)
}
func dfs(root *TreeNode)(int ,int){
    if root==nil{
        return 0,0
    }
    leftsteal,leftnotsteal:=dfs(root.Left)
    rightsteal,rightnotsteal:=dfs(root.Right)
    cursteal:=root.Val+leftnotsteal+rightnotsteal
    curnotsteal:=max(leftsteal,leftnotsteal)+max(rightsteal,rightnotsteal)
    return cursteal,curnotsteal
}

思路

这道题我一开始想到的就是之前做过那道安摄像头的题,想到用flag标记隔层,

大概就是这样 (错误的)

Go 复制代码
func rob(root *TreeNode) int {
    res1:=dfs(root,0,0)
    res2:=dfs(root,1,0)
    return max(res1,res2)
}
func dfs(root *TreeNode,flag int,total int) int{
    if root==nil{
        return 0
    }
    if flag==1{
        total+=root.Val
        total+=dfs(root.Left,0,total)
        total+=dfs(root.Right,0,total)
    }else{
        total+=dfs(root.Left,1,total)
        total+=dfs(root.Right,1,total)
    }
    return total
}

其实怎么说呢,我这里问题主要有total值作为参数传串了,左子树和右子树应该是独立的计算不能干扰 ,然后错误的点就是如果父节点没偷,相当于子节点就必偷了,其实也有父节点没偷,子节点也不偷才是金额最大的情况。比如3-1-2-3,模拟四层,偷第一层和最后一层才是最多的。

所以前序遍历就是错的,后序遍历才是对的,其实如果父亲没偷,就是找子节点偷和不偷的最大值,如果父亲偷了,就是找子节点没偷的最大值,是建立在先知道子节点的最大收益上的,所以选择后序遍历,

第一个就是遍历顺序第二个就是返回值

这道题还有一个关键就是想到有两个返回值,分别代表偷和没偷,我几乎没遇到过这种情况,原来可以两个返回值,

然后剩下的就是把递归的三部+结合后序遍历模版,写代码了

相关推荐
6Hzlia5 小时前
【Classic 150 刷题计划】 LeetCode 228. 汇总区间 | C++ 锚点游标与断点检测法
c++·算法·leetcode
console.log('npc')5 小时前
03 — 核心框架:App 与中间件
后端·node.js·express
小蒜学长5 小时前
基于小程序的绘画作品创作与分享社区系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·绘画作品·创作分享社区
江湖十年5 小时前
Go GOPROXY 兜底链的坑:从一次诡异的 CI lint 失败说起
后端·面试·go
Edward The Bunny5 小时前
Leetcode Hot 100
数据结构·算法
hans汉斯5 小时前
数据挖掘|基于BP神经网络的少数民族村寨文化型旅游体验产品潜在游客挖掘
深度学习·神经网络·算法·yolo·软件工程·bp·汉斯出版社
考虑考虑13 小时前
docker compose V2版本新属性
运维·后端·自动化运维
v_348360876215 小时前
Android native端 堆栈打印
android·算法
residual_fan15 小时前
【学术论文】航空发动机故障诊断智能体:基于持续对比强化学习的动态优化方法
人工智能·算法·数据挖掘·数据分析
GreenTea15 小时前
7000 万 QPS、500 PB:OpenAI 如何用一个 Python 存储平台撑住 10 亿用户
后端·架构