力扣(LeetCode)377

栏目: 数据库 · 发布时间: 5年前

内容简介:题目地址:题目描述:

题目地址:

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冲突,或者是后台已经帮我们谢过了。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

再启动

再启动

[日] 大前研一 / 田龙姬、金枫 / 中华工商联合出版社有限责任公司 / 2010-1 / 29.00元

1、“全球管理大师”、“日本战略之父”大前研一,职场励志最新巨作。 2、2010年1月中华工商联合出版社有限责任公司与日知公司继《货币战争2》《中国大趋势》之后,再度联手,重磅推出。 3、震撼中国职场的宗师级巨作,势必引领2010年中国职场4、世界著名出版商小学馆授予独家中文简体出版权。 5、试问,哪个老板不希望自己的员工不断实现自身的“再启动”呢? 6、只有不断激励鞭策自......一起来看看 《再启动》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具