力扣(LeetCode)377

CodeNebula
• 阅读 1495

题目地址:
https://leetcode-cn.com/probl...
题目描述:
在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。

计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。

示例 1:

输入: [3,2,3,null,3,null,1]

     3
    / \
   2   3
    \   \ 
     3   1

输出: 7 
解释: 小偷一晚能够盗取的最高金额 = 3 + 3 + 1 = 7.
示例 2:

输入: [3,4,5,1,3,null,1]

     3
    / \
   4   5
  / \   \ 
 1   3   1

输出: 9
解释: 小偷一晚能够盗取的最高金额 = 4 + 5 = 9.

解答:
只要比较偷根节点和不偷根节点哪个值大即可。
若偷根节点,则偷盗数额等于root.val+左子树的左右子树偷盗最大值+右子树的左右子树偷盗最大值。
若不偷根节点,则偷盗数额等于左子树的偷盗最大值+右子树的偷盗最大值。

java ac代码:
/**

  • Definition for a binary tree node.
  • public class TreeNode {
  • int val;
  • TreeNode left;
  • TreeNode right;
  • TreeNode(int x) { val = x; }
  • }

*/
class Solution {

public int rob(TreeNode root) {
    //若偷根,则只能偷左右子树的左右子树
    //若不偷根,则左右子树都可以偷
    //比较两者谁大
    
    if(root == null)return 0;
    
    int temp = root.val;
    if(root.left != null)temp += rob(root.left.left)+rob(root.left.right);
    if(root.right != null)temp += rob(root.right.left)+rob(root.right.right);
    
    return Math.max(temp,rob(root.left)+rob(root.right));
}

}

不过这样的复杂度过大,因为有很多步骤被重复计算。
添加一个HashMap记录已经存在的结果,这样避免重复计算。
java ac代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    HashMap<TreeNode,Integer>map = new HashMap(1000);
    
    public int rob(TreeNode root) {
        //若偷根,则只能偷左右子树的左右子树
        //若不偷根,则左右子树都可以偷
        //比较两者谁大
        
        if(root == null)return 0;
        if(map.containsKey(root))return map.get(root);
        int temp = root.val;
        if(root.left != null)temp += rob(root.left.left)+rob(root.left.right);
        if(root.right != null)temp += rob(root.right.left)+rob(root.right.right);
        
        int ans = Math.max(temp,rob(root.left)+rob(root.right));
        map.put(root,ans);
        return ans;
    }
}

这样一来,速度快了很多,不过需要注意的是一般Map的key是类类型,需要重写hashCode和equals方法。这里虽然没写,但是有可能是没有产生hash冲突,或者是后台已经帮我们谢过了。

点赞
收藏
评论区
推荐文章
Stella981 Stella981
3年前
LeetCode 第225场周赛题解
【GiantPandaCV导语】这是LeetCode的第225场周赛的题解,本期考察的知识点有暴力,前缀和,推导等等。比赛链接https://leetcodecn.com/contest/weeklycontest225/题目一:替换隐藏数字得到的最晚时间!(h
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
3年前
LeetCode 227场周赛题解
【GiantPandaCV导语】这是LeetCode的第227场周赛的题解,本期考察的知识点有「暴力,字符串,二进制枚举」等等。比赛链接https://leetcodecn.com/contest/weeklycontest227/题目一:检查数组是否经排序和轮转得到
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Easter79 Easter79
3年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Stella981 Stella981
3年前
Linux日志安全分析技巧
0x00前言我正在整理一个项目,收集和汇总了一些应急响应案例(不断更新中)。GitHub地址:https://github.com/Bypass007/EmergencyResponseNotes本文主要介绍Linux日志分析的技巧,更多详细信息请访问Github地址,欢迎Star。0x01日志简介Lin
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
贾蔷 贾蔷
1个月前
力扣1137题 解题思路和步骤 C++代码实现,力扣一共多少题
一、题目分析力扣1137题要求我们找到第N个泰波那契数。泰波那契数的定义是:T00,T11,T21,且在n0的条件下Tn3TnTn1Tn2。,当n4时,T4T3T2T14。这道题主要考查我们对递归或动态规划的理解和运用。在思考解题方法时,我们