leetcode337. 打家劫舍 III(java)

news2024/12/22 16:48:55

打家劫舍

  • leetcode337. 打家劫舍 III
    • 题目描述
  • 暴力递归
    • 解题思路
    • 代码演示
  • 递归加缓存
    • 代码演示
  • 动态规划专题

leetcode337. 打家劫舍 III

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/house-robber-iii

题目描述

小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 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, 10000] 范围内
0 <= Node.val <= 10000

暴力递归

解题思路

二叉树是有两个分支,我们要分成两个方向讨论这个问题,
当前节点不选时,下面左节点和右节点都可选可不选。
如果当前节点选了,下面左节点和右节点都不能选了。
要去左节点的左右节点和右节点的左右节点去做选择,
好了知道这两种情况了,我们就可以正常写代码了。

代码演示

/**
* 主方法调用
*/
   public int rob(TreeNode root) {
        if(root == null){
            return 0;
        }
     
      return process(root);
    }
/**
* 递归 
*/
 public int process(TreeNode root){
 			//base case 
        if(root == null){
            return 0;
        }
        //当前节点不选的时候,我们去左右节点去做选择。
        int p1 = process(root.left);
        int p2 = process(root.right);
        //如果当前节点选择的话,剩下的就只能去当前节点的左节点下的左右节点做选择
        int p3 = 0;
        if(root.left != null){
            int n1 = process(root.left.left);
            int n2 = process(root.left.right);
            //左右两种情况是独立的,因此要加在一起
            p3 = n1 + n2;
        }
          //如果当前节点选择的话,剩下的就只能去当前节点的右节点下的左右节点做选择
        int p4 = 0;
        if(root.right != null){
            int n1 = process(root.right.left);
            int n2 = process(root.right.right);
             //左右两种情况是独立的,因此要加在一起
            p4 = n1 + n2;
        }
        //p3 和 p4 是选择当前节点下左右分支的情况,所以要加上当前节点的值。
        //和不选的情况做比较 选择最大值
        //p1 + p2 左右两种选择是不会互相影响的,因此要相加
        return Math.max((p1 + p2),(p3 + p4 + root.val));
    }

递归加缓存

暴力递归中有大量的重复计算,因此我们要把重复计算放到缓存里优化递归过程。
变量只有一个,递归时不断去选择不同节点,因此用HashMap 去记录就行了

代码演示

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public int rob(TreeNode root) {
        if(root == null){
            return 0;
        }
        HashMap<TreeNode,Integer> ans = new HashMap<>();
        return process(root,ans);
    }

     public int process(TreeNode root, HashMap<TreeNode,Integer> ans){
        if(root == null){
            return 0;
        }
        //缓存中如果有,直接在缓存中拿
        if(ans.containsKey(root)){
            return ans.get(root);
        }
        //不选当前节点时
        int p1 = process(root.left,ans);
        int p2 = process(root.right,ans);
        //选择当前节点时
        int p3 = 0;
   
        if(root.left != null){
            int n1 = process(root.left.left,ans);
            int n2 = process(root.left.right,ans);
            p3 = n1 + n2;
        }
        int p4 = 0;
        if(root.right != null){
            int n1 = process(root.right.left,ans);
            int n2 = process(root.right.right,ans);
            p4 = n1 + n2;
        }
        int p5 = Math.max((p1 + p2),(p3 + p4 + root.val));
        //结果放到缓存中
        ans.put(root,p5);
        return p5;
    }
   }

动态规划专题

零钱兑换,凑零钱问题

leetcode213. 打家劫舍

leetcode198. 打家劫舍

leetcode174. 地下城游戏

打败怪兽的概率

leetcode688. 骑士在棋盘上的概率


凑零钱-钱币的组合有多少种II

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/643344.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

湖南大学CS-2019期末考试解析

【特别注意】 答案来源于@wolf 是我在备考时自己做的,仅供参考,若有不同的地方欢迎讨论。 【试卷评析】 有必要一做。 【试卷与答案】 一. 填空题(10 分,每空 2 分) 1. 0xb1e56f07 存放在采用小端存储的机器上,地址为 0x3287 到 0x328a ,则 0x3288 处存…

远程仓库拉不下来怎么办

因为项目需要做一个word转pdf的功能, 当我想要从阿里的仓库引入依赖时发现版本一直报错,无论怎么引入都爆红😭😭 *我将aspose的包先下载到本地,然后再安装安装到本地的maven仓库* mvn install:install-file -Dfile=C:\Users\Administrator\Downloads\aspose-words-18.…

Day01 项目简介分布式基础概念 -谷粒商城

最近在改进公司开发的商城项目&#xff0c;看到了尚硅谷的谷粒商城&#xff0c;就快速学习了下&#xff0c;因为之前的Kafka,Redis都是在这学习的&#xff0c;还有大数据的Flink。所以感觉一定不错&#xff0c;就开始了。 这里做一下学习笔记 一、项目简介 1 、项目背景 1 &…

一文看懂分布式存储 Ceph 架构原理

【摘要】本文带你层层深入Ceph的架构原理、读写原理&#xff0c;从而理解Ceph的特性及其应用场景。 1. 什么是Ceph&#xff1f; 首先&#xff0c;我们从 Ceph的官方网站上&#xff0c;可以看到&#xff1a;“Ceph is a unified, distributed storage system designed for exc…

第六章volatile详解

文章目录 volatile修饰的变量有2大特点volatile的内存语义 内存屏障是什么内存屏障分类粗分两种细分四种 什么叫保证有序性happens-before之volatile变量规则JMM就将内存屏障插入策略分为4种规则 volatile特性如何保证可见性说明例子volatile变量的读写过程 为何没有原子性例子…

软件测试“学历低”?10条人生逆袭建议

最近有粉丝私信问我“我学历低&#xff0c;投的简历屡屡石沉大海&#xff0c;不知道该怎么办&#xff1f;”之前也回答过其他人&#xff0c;今天把我的建议整理分享给大家。 学历是一块敲门砖&#xff0c;它会影响毕业以后的我们相当长一段时间&#xff0c;但并不是决定了我们…

fiddler抓包番外————了解工具栏

前言 作为一款功能强大的工具&#xff0c;Fiddler 提供了许多实用的功能和工具栏&#xff0c;可以帮助用户更加高效地使用它。 如果您想了解 Fiddler 的工具栏及其功能&#xff0c;那么本篇文章就是为您准备的。 在这里&#xff0c;我将为大家详细介绍 Fiddler 的工具栏及其…

Redis缓存预热、缓存穿透、缓存击穿、缓存雪崩,Redis布隆过滤器怎么实现?

目录 一、缓存预热1、缓存预热常见步骤2、代码实现 二、缓存雪崩1、什么情况会发生缓存雪崩&#xff1f;2、Redis缓存集群实现高可用3、如何避免Redis缓存雪崩&#xff1f; 三、缓存穿透1、什么情况会发生缓存穿透&#xff1f;2、如何避免Redis缓存穿透&#xff1f; 四、通过空…

Vue中如何实现轮播图、滑块选择器

Vue中如何进行滑动组件实现 在Vue应用中&#xff0c;滑动组件是一个常见的UI组件&#xff0c;例如轮播图、滑块选择器等等。本文将介绍如何使用Vue实现这些滑动组件。 轮播图 轮播图是一种常用的滑动组件&#xff0c;它通常用于展示多个图片或广告。在Vue中&#xff0c;我们可…

【人工智能里的数学】多元函数的微分学

【人工智能里的数学】多元函数的微分学 系列文章目录 【人工智能学习笔记】人工智能里的数学——概述 【人工智能里的数学】一元函数微分学 【人工智能里的数学】线性代数基础 【人工智能里的数学】多元函数微分学 文章目录 文章目录 系列文章目录文章目录偏导数高阶偏导数梯…

论文笔记--LIMA: Less Is More for Alignment

论文笔记--LIMA: Less Is More for Alignment 1. 文章简介2. 文章概括3 文章重点技术3.1 表面对齐假设(Superfacial Alignment Hypothesis)3.2 对齐数据3.3 训练 4 数值实验5. 文章亮点5. 原文传送门6. References 1. 文章简介 标题&#xff1a;LIMA: Less Is More for Alignm…

FTP协议分析(主动模式和被动模式)

今天本来计划分析下suricata中协议识别和解析的代码的&#xff0c;准备先从ftp协议开始看&#xff0c;不过看了一会儿代码后&#xff0c;还是觉得有必要对ftp协议的细节先熟悉熟悉。 目录 1、FTP环境搭建工具 2、FTP协议介绍 3、FTP文件操作命令列表 4、FTP请求码列表 5、…

硬件测试---相位噪声测试

一&#xff1a;相位噪声的概述 相位噪声是指信号或振荡器在频率上的相位变动或不稳定性。它是相对于理想稳定振荡器的相位偏离或波动的度量。相位噪声的存在意味着信号的相位在时间上会有微小的变化或扰动&#xff0c;这可能对某些应用产生负面影响。 相位噪声通常以相位噪声密…

【电子技术综合设计】数字钟(包含计数模块、12/24进制切换模块以及闹钟模块)

工程文件&#xff1a; https://pan.baidu.com/s/1PnYd2mwMUf0tgxczdcl2MA 提取码: ihrk B站演示&#xff1a; 【电子技术综合设计】数字电子时钟&#xff08;包含计数模块、12/24进制切换模块以及闹钟模块&#xff09;_哔哩哔哩_bilibili 一、设计要求 1. 24小时制的时、分…

基于Java汽车在线租赁管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

吴恩达老师《机器学习》课后习题2之逻辑回归(logistic_regression)

逻辑回归-线性可分 用于解决输出标签y为0或1的二元分类问题。判断邮件是否属于垃圾邮件&#xff1f;银行卡交易是否属于诈骗&#xff1f;肿瘤是否为良性&#xff1f;等等。 案例:根据学生的两门学生成绩&#xff0c;建立一个逻辑回归模型&#xff0c;预测该学生是否会被大学录…

一、深度学习引言

文章目录 一、机器学习中的关键组件1. 数据2. 模型3. 目标函数4. 算法 二、各种机器学习问题1. 有监督学习1.1 回归1.2 分类1.3 标记问题1.4 搜索1.5 推荐系统1.6 序列学习 2. 无监督学习3. 与环境互动4. 强化学习 三、深度学习的发展 一、机器学习中的关键组件 1. 数据 数据…

MM32F3273G8P火龙果开发板MindSDK开发教程17 -U8g2库的移植

MM32F3273G8P火龙果开发板MindSDK开发教程17 -U8g2 OLED库的移植 1、U8g2简介 手头正好有一块0.96寸的OLED屏&#xff0c;驱动芯片为ssd1306&#xff0c;心想怎么才能显示更为炫彩的图像。无意间&#xff0c;接触到U8g2图形库&#xff0c;遂决定将其移植到自己的工程中。 U8g…

2023软件测试面试避坑指南

今年2023整体IT行业不景气&#xff0c;大厂小厂裁员不断&#xff0c;因岗位稀缺&#xff0c;匹配性&#xff0c;竞争大&#xff0c;被裁以后面临房贷、车贷等压力&#xff0c;不得不看下银行卡&#xff0c;还能够支撑多久&#xff0c;得赶紧地找下一家&#xff0c;但偏偏事与愿…

深入学习 Mybatis 的四大组件源码

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; &#x1f495;&#x1f495; 感兴趣的同学可以收…