LeetCode_BinaryTree_337. House Robber III 打家劫舍 III【动态规划】【Java】【中等】

2023-11-14

目录

一,题目描述

英文描述

中文描述

示例与说明

二,解题思路

三,AC代码

Java

四,解题过程

第一搏

第二搏


 

一,题目描述

英文描述

The thief has found himself a new place for his thievery again. There is only one entrance to this area, called root.

Besides the root, each house has one and only one parent house. After a tour, the smart thief realized that all houses in this place form a binary tree. It will automatically contact the police if two directly-linked houses were broken into on the same night.

Given the root of the binary tree, return the maximum amount of money the thief can rob without alerting the police.

中文描述

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

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

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

示例与说明

 

 

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/house-robber-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二,解题思路

参考官方题解@力扣官方题解【打家劫舍 III】

后序遍历+动态规划,后序遍历指明了动态规划的转移顺序。

声明一个长度为2的数组记录动态规划过程中产生的值,其中位置0表示不选择当前节点,1表示选择当前节点;

先遍历左子树得到左子树的状态数组leftTree,再遍历右子树得到右子树的状态数组rightTree,最后可以得到当前节点的状态数组ans

不选当前节点,左右子树节点可选可不选(取两种方案最大值): 

  • ans[0] = Math.max(leftTree[0], leftTree[1]) + Math.max(rightTree[0], rightTree[1])

选择当前节点,左右两子节点均不能选择: 

  • ans[1] = root.val + leftTree[0] + rightTree[0]

三,AC代码

Java

class Solution {

    public int rob(TreeNode root) {
        int[] ans = dfs(root);
        return Math.max(ans[0], ans[1]);
    }
    public int[] dfs(TreeNode root) {
        if (root == null) return new int[]{0, 0};
        int[] leftTree = dfs(root.left);
        int[] rightTree = dfs(root.right);
        int[] ans = new int[2];
        
        ans[1] = root.val + leftTree[0] + rightTree[0];// 选择root节点,则左右子树节点不能被选中
        ans[0] = Math.max(leftTree[0], leftTree[1]) + Math.max(rightTree[0], rightTree[1]);// 不选root节点,左右子树节点可选可不选(取两种方案最大值)
        return ans;
    }
}

四,解题过程

第一搏

后序遍历 + 双hash表(分别记录是否选择当前节点下的情况)

class Solution {
    Map<TreeNode, Integer> choose = new HashMap<>();
    Map<TreeNode, Integer> notChoose = new HashMap<>();
    public int rob(TreeNode root) {
        choose.put(null, 0);
        notChoose.put(null, 0);
        dfs(root);
        return Math.max(choose.get(root), notChoose.get(root));
    }
    public void dfs(TreeNode root) {
        if (root == null) return;
        dfs(root.left);
        dfs(root.right);

        int ans = 0;
        ans = root.val + notChoose.get(root.left) + notChoose.get(root.right);
        choose.put(root, ans);

        int maxLeft = Math.max(choose.get(root.left), notChoose.get(root.left));
        int maxRight = Math.max(choose.get(root.right), notChoose.get(root.right));
        ans = maxLeft + maxRight;
        notChoose.put(root, ans);
    }
}

第二搏

注意到后序遍历过程中,只会用到当前节点左右两子树节点对应的状态,因此递归返回值可以用大小为2的数组代替,其中位置0表示不选择当前节点,1表示选择当前节点。

这样递归过程将会变得更加简洁

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode_BinaryTree_337. House Robber III 打家劫舍 III【动态规划】【Java】【中等】 的相关文章

随机推荐

  • Transformer——《Attention is all you need》

    本文是Google 机器翻译团队在2017 年发表 提出了一个新的简单的网络模型 Transformer 该模型基于纯注意力机制 Attention mechanisms 完全抛弃了RNN和CNN网络结构 在机器翻译任务上取得了很好的效果
  • 设计和开发如何获取真实的客户产品需求

    某富翁想要娶老婆 有三个人选 富翁给了三个女孩各一千元 请她们把房间装满 第一个女孩买了很多棉花 装满房间的1 2 第二个女孩买了很多气球 装满房间3 4 第三个女孩买了蜡烛 让光线充满房间 最终 富翁选了胸部最大的那个 这个故事告诉我们
  • 五种开源协议的具体区别

    1 BSD开源协议 original BSD license FreeBSD license Original BSD license 修改源码后可以选择闭源 修改后的文档不用进行版权说明 衍生软件的广告不能用你的名字促销 2 Apache
  • 爬虫Scrapy框架之学习使用(三):信号(Signals)

    Extension for collecting core stats like items scraped and start finish times import datetime from scrapy import signals
  • 【分布式-Redis应用】Spring中Redis使用项目实战(持续更新...)

    TOC 目录标题 场景及代码示例 1 list集合存储到Redis以及读取 import org springframework data redis core StringRedisTemplate Autowired private S
  • qt对excel的基本操作

    qt对excel的基本操作 1 环境 1 1 配置方面 确保Excel软件在本地服务器注册成功 没注册成功的可以通过 在运行中 E program Files Microsoft Office Office12 EXCEL EXE regs
  • 代数余子式与伴随矩阵

    关系 例题 伴随矩阵运算
  • redis配置文件限制只能本地访问问题,虚拟机无法访问

    解决 修改配置文件 daemonize no 用守护线程的方式启动 requirepass yourpassword 给redis设置密码 bind 192 168 1 1 注释掉这部分 这是限制redis只能本地访问 appendonly
  • 双栈排序 二分图匹配

    题目链接 https www acwing com problem content description 155 题目 Tom最近在研究一个有趣的排序问题 通过2个栈S1和S2 Tom希望借助以下4种操作实现将输入序列升序排序 操作a 如
  • (十一)jmeter-集合点---学习笔记

    集合点 简单来理解一下 虽然我们的 性能测试 理解为 多用户并发测试 但真正的并发是不存在的 为了更真实的实现并发这感念 我们可以在需要压力的地方设置集合点 每到输入用户名和密码登录时 所有的虚拟用户都相互之间等一等 然后 一起访问 注意
  • Acwing-4655. 重新排序

    我们可以累计每个 A i 的被求和次数 c i 容易贪心得到 被求和次数越多的肯定得放越大的数 我们可以先统计原来的求和的总和 sum 再给 A 数组和统计求和次数的数组 c 从小到大排好序 最后依次相乘起来即 i 1 n a i c i
  • Win10+VS2015编译caffe踩坑记录

    跑HTM的代码要用到caffe的库 从学长那拷过来的工程里是用VS2013编译的 只能用自己的VS2015重新编译一下 记录一下编译过程 环境 Windows10 VS2015 cuda8 0 cudnn5 1 CMake3 17 0 An
  • 漂亮的弹出框,javascript库bootbox介绍

    传统的javascript的警告框 确认框 提示框
  • 【数字图像处理】三.MFC实现图像灰度、采样和量化功能详解

    本文主要讲述基于VC 6 0 MFC图像处理的应用知识 主要结合自己大三所学课程 数字图像处理 及课件进行讲解 主要通过MFC单文档视图实现显示BMP格式图片 并通过Bitmap进行灰度处理 图片采样和量化功能 个人认为对初学者VC 6 0
  • python 如何解决 No module named ‘pip‘问题

    在下载python第三方库的时候 突然报错 解决方法很简单 两行代码就行了 python m ensurepip easy install pip 此时下载 还不行 提示说要更新pip python m pip install upgrad
  • python 21点

    21点 你可以叫我仁哥 也可以叫我情哥 mua 没请教 21点黑杰克 代码部分 相关说明 我做的是一个简化了的21点没有分牌操作 21点黑杰克 废话不多说先上代码 代码部分 import random import time 延时的这里可以
  • MySql中的先聚合再筛选与先筛选再聚合

    MySql中的先聚合再筛选与先筛选再聚合 where字句在聚合前先筛选记录 也就是说作用在group by和having字句前 而 having子句在聚合后对组记录进行筛选 事例 一 显示每个地区的总人口数和总面积 SELECT area
  • mysql主从同步

    set global server id 2 show slave status 查看binlog日志信息 stop slave change replication filter replicate do db bypass change
  • Qt 控件设置透明和半透明方法汇总

    遇到了好多次控件有需要设置为透明和半透明的情况 每次都是去网上搜一搜 看看别人怎么实现的 浪费了很多时间 故在这里进行一个总结 希望对自己有一个提升 本文对透明的各种情况进行了分类 整个窗口及窗口下的控件都是半透明的状态 分类一 只有窗口是
  • LeetCode_BinaryTree_337. House Robber III 打家劫舍 III【动态规划】【Java】【中等】

    目录 一 题目描述 英文描述 中文描述 示例与说明 二 解题思路 三 AC代码 Java 四 解题过程 第一搏 第二搏 一 题目描述 英文描述 The thief has found himself a new place for his