LeetCode 337. 打家劫舍 III

原题链接:. - 力扣(LeetCode)

小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root

除了 root 之外,每栋房子有且只有一个"父"房子与之相连。一番侦察之后,聪明的小偷意识到"这个地方的所有房屋的排列类似于一棵二叉树"。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。

给定二叉树的 root 。返回 在不触动警报的情况下 ,小偷能够盗取的最高金额

示例 1:

复制代码
输入: root = [3,2,3,null,3,null,1]
输出: 7 
解释: 小偷一晚能够盗取的最高金额 3 + 3 + 1 = 7

示例 2:

复制代码
输入: root = [3,4,5,1,3,null,1]
输出: 9
解释: 小偷一晚能够盗取的最高金额 4 + 5 = 9

提示:

  • 树的节点数在 [1, ] 范围内
  • 0 <= Node.val <=

思路:

本题是一道 树形 DP 类的题目。需要熟悉二叉树的遍历和动态规划的知识。由于每个节点都需要根据其子节点来判断当前状态(偷或者不偷),因此本题采用后序遍历。动态规划的 dp 数组可以仅是一个 int [ ] 数组,为每一个节点创建一个这样的 dp 数组(通过递归创建)。数组里面只有两个值,dp [ 0 ] 表示偷当前节点所能获得的最高金额,dp [ 1 ] 表示不偷当前节点所能获得的最高金额。 下面是递归函数的写法:

  • 确定函数的返回值和参数:返回值是 动态规划的数组 res,参数是当前节点。
  • 终止条件:当遇到叶子节点的子节点时,返回一个 默认值为 0 的 res 数组,表示当前节点无论偷还是不偷所能获取的最高金额都是 0 。
  • 单层处理逻辑:首先获取左子节点的状态数组 leftVal(偷或者不偷所能带来的最高金额),再获取右子节点的状态数组 rightVal 。最后根据左右子节点的状态来决定当前节点的状态数组 res。res[ 0 ] 表示偷当前节点所能带来的最高金额,当偷当前节点时,那么这时不能偷左右子节点,因此偷当前节点所能带来的最高金额为 res[ 0 ] = root.val + leftVal [ 1 ] + rightVal [ 1 ]。res[ 1 ] 表示不偷当前节点所能带来的最高金额,当不偷当前节点时,那么这时是否偷左右子节点,就是由左右子节点的状态决定的了。res[ 1 ] 为左子节点的最大金额加上右子节点的最大金额。res[1]=Math.max(leftVal[0],leftVal[1])+Math.max(rightVal[0],rightVal[1]);

最后 获取根节点的 状态数组 res,然后返回 res 数组中的最大值即可。

代码:

java 复制代码
class Solution {
    public int rob(TreeNode root) {
        int[] res = new int[2];
        res = robTree(root);
        return Math.max(res[0],res[1]);
    }
    public int[] robTree(TreeNode root){
        int[] res = new int[2];
        if(root==null){
            return res;
        }
        int[] leftVal = robTree(root.left);
        int[] rightVal = robTree(root.right);
        //res[0]表示偷当前节点,所能盗取的最高金额
        //res[1]表示不偷当前节点,所能盗取的最高金额
        res[0]= root.val+leftVal[1]+rightVal[1];//偷当前节点,则其子节点不能偷
        //不偷当前节点,则其子节点可偷可不偷,由子节点偷或者不偷能带来的最高金额决定
        res[1]=Math.max(leftVal[0],leftVal[1])+Math.max(rightVal[0],rightVal[1]);
        return res;
    }
}

参考:动态规划,房间连成树了,偷不偷呢?| LeetCode:337.打家劫舍3_哔哩哔哩_bilibili

相关推荐
临沂堇11 分钟前
CCF刷题计划——训练计划(反向拓扑排序)
数据结构·c++·算法·拓扑·ccf
铁匠匠匠16 分钟前
【C总集篇】第八章 数组和指针
c语言·开发语言·数据结构·经验分享·笔记·学习·算法
Unicorn建模19 分钟前
2024“华为杯”中国研究生数学建模竞赛(E题)深度剖析|数学建模完整过程+详细思路+代码全解析
python·算法·数学建模
咕咕吖22 分钟前
二叉树的层序遍历(c)
数据结构·算法
子非鱼9211 小时前
【JavaScript】LeetCode:41-45
开发语言·javascript·leetcode·链表·二叉树
“JB...One”1 小时前
openssl-AES-128-CTR加解密结构体
linux·数据结构·算法·ssl
爱数模的小云1 小时前
【华为杯】2024华为杯数模研赛D题 解题思路
算法·华为
好记性+烂笔头2 小时前
hot100-438. 找到字符串中所有字母异位词
算法
六点半8882 小时前
【C/C++】速通涉及string类的经典编程题
c语言·开发语言·c++·算法
@听风吟2 小时前
力扣之182.查找重复的电子邮箱
大数据·javascript·数据库·sql·leetcode