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,模拟四层,偷第一层和最后一层才是最多的。

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

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

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

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

相关推荐
营养充电站3 小时前
KMP全栈开发:从Android到AI Agent的技术演进与实践
人工智能·算法·docker·jupyter
程序员cxuan3 小时前
速度太快了!本地可以跑 DeepSeek-V4-Flash 了
人工智能·后端·程序员
技术小黑3 小时前
RNN算法实战系列05 | 天气预测
人工智能·rnn·算法
阿祖zu4 小时前
芝士就是力量!开源私有化部署与 GitHub 双向同步的个人知识笔记 App
前端·后端·ios
不才不才不不才4 小时前
Spring 源码系列(16): doDispatch 全流程——一次请求的主干链路
java·后端·spring
IT_陈寒4 小时前
SpringBoot自动配置失效?这个隐藏配置坑了我一整晚
前端·人工智能·后端
搜狐技术产品小编20234 小时前
告别“黑盒”与误判:如何用“多智能体对抗辩论”重构内容安全审核系统
后端·多agent
DantyWei5 小时前
controller注册及调用时机
后端
edwarddamon5 小时前
Spring Cloud 配置热更新与 Bean 代理机制梳理
java·后端