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

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

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

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

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

相关推荐
梅梅绵绵冰1 小时前
数据结构-时间复杂度
数据结构·算法
遥感知识服务1 小时前
盐碱地、白屋顶和裸土都很亮,卫星怎样分清?
人工智能·算法·机器学习
可编程芯片开发1 小时前
基于PID控制器的车辆控制系统simulink建模与仿真
算法
广州灵眸科技有限公司1 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) 系统操作-线进程操作
数据库·单片机·嵌入式硬件·算法·php
-dzk-2 小时前
【哈希】LC 49.字母异位词分组
算法·哈希算法
站大爷IP2 小时前
Python的浅拷贝把我坑惨了,原来copy()和deepcopy()的区别这么大
后端
·醉挽清风·2 小时前
学习笔记—算法—算法题
笔记·学习·算法
2401_854151552 小时前
嵌入式传感器驱动开发深度解析——从 I2C/SPI 驱动到数据融合算法
驱动开发·算法
cpp_25012 小时前
P6625 [省选联考 2020 B 卷] 卡牌游戏
数据结构·c++·算法·前缀和·贪心·洛谷题解·省选