java数据结构与算法刷题-----LeetCode337. 打家劫舍 III

150道基础算法分类总结(2022) 在刷了一部分leetcode算法题之后,想要回头系统复习一下,发现刷的比较乱,特此整理一下,方便后续二刷,主要是对各种类型算法的一个分类,以及比较典型的题目的整理。 学习说明 题目来源lettcode 参考代码是用Java写的 供自己方便学习 算法分类 1. 二叉树 树也是一种非常重要的数据结构,因为很多容器的底层都设计到树,所以树也成了面试常问的重点了。特别是二叉树及二叉搜索树的算法。 二叉树的考点 题目来源 扩展 题解参考 二叉树的遍历(递归和迭代实现) 102. 二叉树的层序遍历 阅读详情
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846

很多人觉得动态规划很难,但它就是固定套路而已。其实动态规划只不过是将多余的步骤,提前放到dp数组中(就是一个数组,只不过大家都叫它dp),达到空间换时间的效果。它仅仅只是一种优化思路,因此它目前的境地和线性代数一样----虚假的难。

  1. 想想线性代数,在国外留学的学生大多数不觉得线性代数难理解。但是中国的学生学习线性代数时,完全摸不着头脑,一上来就是行列式和矩阵,根本不知道这玩意是干嘛的。
  2. 线性代数从根本上是在空间上研究向量,抽象上研究线性关系的学科。人家国外的教科书都是第一讲就帮助大家理解研究向量和线性关系。
  3. 反观国内的教材,直接把行列式搞到第一章。搞的国内的学生在学习线性代数的时候,只会觉得一知半解,觉得麻烦,完全不知道这玩意学来干什么。当苦尽甘来终于理解线性代数时干什么的时候,发现人家国外的教材第一节就把这玩意讲清楚了。你只会大骂我们国内这些教材,什么狗东西(以上是自己学完线性代数后的吐槽,我们同学无一例外都这么觉得)。

而我想告诉你,动态规划和线性代数一样,我学完了才知道,它不过就是研究空间换时间,提前将固定的重复操作规划到dp数组中,而不用暴力求解,从而让效率极大提升。

  1. 但是网上教动态规划的兄弟们,你直接给一个动态方程是怎么回事?和线性代数,一上来就教行列式和矩阵一样,纯属恶心人。我差不多做了30多道动态规划题目,才理解,动态方程只是一个步骤而已,而这已经浪费我很长时间了,我每道题都一知半解不理解,过程及其痛苦。最后只能重新做。
  2. 动态规划,一定是优先考虑重复操作与dp数组之间的关系,搞清楚后,再提出动态方程。而你们前面步骤省略了不讲,一上来给个方程,不是纯属扯淡吗?
  3. 我推荐研究动态规划题目,按5个步骤,从上到下依次来分析
  1. DP数组及下标含义
  2. 递推公式
  3. dp数组初始化
  4. 数组遍历顺序(双重循环及以上时,才考虑)
  5. dp数组打印,分析思路是否正确(相当于做完题,检查一下)

在这里插入图片描述

1. 动态规划+深度优先

1.1 解题思路和细节

题目细节
  1. 想要偷到最多的钱,一定要遵循,适当取舍
  2. 比如上一个结点没偷,那么这个结点也不一定非要偷,因为你这个不偷,下一个就可以偷。
  3. 所以使用深度优先遍历,对于每个结点,都有两个选择,偷与不偷,而相邻的多个结点直接,不用非得隔一个偷一个,而是选择最大的方案。

比如100,1,2,3,4,100. 如果隔一个偷一个的话为100,1,2,3,4 = 106,100或100,1,2,3,4,100 = 104,但是如果是100,1,2,3,4,100 = 203明显是最大的方案.

  1. 特别注意:无论选择偷与不偷,都需要将左右子结点相加,因为只是相邻的结点不能偷,而不是整个子树都不能偷
图解
  1. 以此为例:其中dp数组含义是dp[当前结点偷的话当前共偷多少,不偷共偷多少]
    在这里插入图片描述
  2. 对于深度优先遍历的第一个结点为,左下角的3
    在这里插入图片描述
  1. 它的左子树是null,所以左子树偷与不偷都是0元,故其左子树的dp数组为dp[0,0],表示左子树偷的话共偷0元,不偷的话共偷0元
  2. 它的右子树是null,一样偷不偷都是0,故其右子树dp为dp[0,0]
  3. 它本身是3,所以偷的话就是+3.不偷的话就不加3
  1. 偷当前结点,那么左子树和右子树都不能偷,左子树不偷的话是0,右子树不偷也是0,合起来为0+0=0,因为都是0,所以就拿到0.加上当前结点3 共偷3元
  2. 不偷当前结点,那么左子树和右子树可以偷,左子树偷根结点和不偷都有0,右子树偷也是0,两棵子树都选最大的,合起来为0+0=0,当前结点也不偷,共偷0元
  1. 最终得到当前结点dp数组为dp[3,0],表示偷当前结点,不能偷两个直接儿子共获取3元,不偷当前结点偷左右儿子结点可偷0元
  1. 第二个遍历结点为它上面的2
    在这里插入图片描述
  1. 左子树为null,偷和不偷可获利[0,0]
  2. 右子树为3,偷和不偷分别获利[3,0]
  3. 当前结点如果偷,则+2,不偷则不加
  1. 偷当前结点,则左子树和右子树不能偷,左子树不偷为0,右子树不偷为0,合起来为0,则偷当前结点+2,获利2元
  2. 不偷当前结点,则左子树和右子树可以偷,左子树偷和不偷都为0,右子树偷为3,不偷为0,左右子树都选大的方案合为0+3 = 3,则不偷当前结点,获利3
  1. 因此当前结点dp为dp[2,3],表示偷当前结点的话,一共获利2元,不偷当前节点,共获利3元
  1. 第3个遍历的结点是右下角的1,同理,左右子树都为null,则偷当前结点为1,不偷为0,故dp[1,0]
  2. 第4个遍历的是右下角1的父结点3,同理,左子树为null,右子树为1,dp[1,0],故当前结点dp[3,1].表示偷当前结点,下面1不偷,为3.不偷当前结点,偷下面那个1为1
  3. 最后是根结点3
    在这里插入图片描述
  1. 如果偷当前结点
  1. 则左子结点不能偷,左子结点dp为[2,3],也就是不偷它,共有为3
  2. 右子结点也不能偷,为1
  3. 则,偷当前结点的3,加上左子结点不偷共有3,右子结点不偷共有1,加起来为7.
  1. 不偷当前结点
  1. 左子结点可以偷也可以不偷,偷有2,不偷为3,选大的3
  2. 右子结点,偷有3,不偷为1,选大的共有3
  3. 不偷当前结点为0,加上左子结点不偷,共有3,右子结点偷,共有3。加起来为6
  1. 故,根节点dp为dp[7,6]
  1. 最终,因为我们要偷最多的钱,所以选择dp[7,6]中大的那个,为7
动态规划5步曲
  1. DP数组及下标含义
  1. 我们要求出的是二叉树相邻结点不能都偷的情况下,最多偷多少钱。显然dp数组中存储的是相邻结点如果偷,能偷多少钱,不偷相邻的,而偷当前结点能有多少钱。要求出谁的?显然是求出,以当前结点来看,前面一个结点偷还是不偷。那么下标就是代表前一个结点偷还是不偷,很显然,只需要一个下标,也就是一维数组。而且这个一维数组只有两个元素,代表偷和不偷
  1. 递推公式
  1. 假设left[a,b]表示左子树中偷了左儿子,共有left[a]元,不偷左儿子,共有left[b]元,同理right[a,b]为右子树
  2. 当前结点偷的话,左右儿子不能偷,不偷左儿子为left[b],不偷右儿子为right[b]。
  3. 当前结点不偷,左右儿子可以偷也可以不偷,偷左儿子为left[a],不偷为left[b],偷右儿子为right[a],不偷为right[b]
  4. 故dp[n] = [本身 + left[b] + right[b] ,max{ left[a] , left[b] } + max{ right[a] , right[b] }.也就是当前结点,偷的话,就是本身+左子树不偷左儿子+右子树不偷右儿子。不偷当前结点,就是左子树偷左儿子或不偷左儿子选大的+右子树偷或不偷右儿子选大的
  1. dp数组初始化

在这里插入图片描述

  1. 数组遍历顺序(单重循环,无需考虑遍历顺序,一共就一维,哪里来的谁先谁后)
  2. 打印dp数组(自己生成dp数组后,将dp数组输出看看,是否和自己预想的一样。)

在这里插入图片描述

2.2 代码实现

代码

在这里插入图片描述

class Solution {
    public int rob(TreeNode root) {
        int[] dp = dfs(root);//获取dp数组
        return Math.max(dp[0],dp[1]);//返回最后一个房子偷与不偷,最大的结果
    }
    //int[]{偷当前结点最大获利,不偷当前结点最大获利}
    int[] dfs(TreeNode root){
        if (root == null)return new int[]{0,0};//如果没的遍历,就返回0,0,表示偷和不偷当前结点都是获利0,因为没有这个房子
        int[] left = dfs(root.left);//获取左子树dp数组
        int[] right = dfs(root.right);//获取右子树dp数组
        //如果偷当前结点,则只有一种选择,就是不偷左右子树根节点
        int yes = root.val+ left[1] + right[1];
        //如果不偷当前房子,则左右子树都需要偷
        //左子树我们偷根结点,和不偷根节点,选大的
        //右子树我们也可以选择偷根节点,或不偷,选大的
        int no = Math.max(left[0],left[1]) + Math.max(right[0],right[1]);
        //返回当前结点偷和不偷
        return new int[]{yes,no};
    }
}
QDMA工程搭建/windows驱动编译与性能测试 请注意,根据您的目标操作系统,您可能需要在windows启动配置中启用测试签名的驱动程序,以便启用此驱动程序的安装。右键单击设备,选择更新驱动程序软件,然后选择构建的QDMA驱动程序的文件夹(通常为。创建一个新工程,在IP Catalog中搜索QDMA,双击创建qdma ip核。驱动程序安装安装驱动程序最简单的方法是通过Windows的“设备管理器”。如果系统提示未经验证的驱动程序发布者,请选择无论如何安装此驱动程序软件。本节主要介绍QDMA驱动在Windows系统的源文件、编译和安装过程。 阅读详情

相关推荐

我花3年踩坑总结的C#上位机开发指南:从零基础到项目落地(附实战案例)

串口乱码:编码格式不匹配,一定要和设备端确认;PLC连接超时:检查IP地址和端口,确保上位机和PLC在同一网段;界面卡死:耗时操作没开线程,WinForm用BackgroundWorker,WPF用Task;数据解析错误:寄存器地址算错(Modbus地址从0还是1开始);Modbus数据丢包:加CRC校验,重要数据重发机制;WPF绑定不生效:忘记实现INotifyPropertyChanged;项目打包失败:缺少依赖DLL,用Dependency Walker检查;现场环境不兼容。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1845

力扣337——打家劫舍 III

这一篇也是基于"打家劫舍"的扩展,需要针对特殊情况特殊考虑,当然其本质还是动态规划,优化时需要考虑数据结构。 原题 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被...

death05的博客 1107

具身智能:从理论突破到场景落地的全解析

具身智能(Embodied Intelligence)是人工智能与机器人学深度融合的前沿领域,其核心在于通过物理实体与环境的动态交互实现智能行为。区别于传统 AI 的 “离身性”(如语音助手仅依赖数据输入),具身智能强调 “智能体通过身体感知世界并反作用于环境”,形成 “感知 - 决策 - 行动” 的闭环。例如,能自主避障的配送机器人、可精准抓取异形物体的机械臂,均通过传感器网络与环境实时互动,在试错中优化行为策略。

LeeKumaの技术Note 2683

LeetCode-337题:打家劫舍III(原创)

递归函数存在大量重复调用的情况,可以考虑设计一个缓存来存储已经计算好的节点,这样能大大提高算法性能

it_fly的专栏 1198

Python学习24:中国古代数学问题——物不知数(Python123)

意思是说有一些物品,不知道有多少个,3个3个数的话,还多出2个;5个5个数则多出3个;7个7个数也会多出2个。题目为‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬‬:今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?现假设物品总数不超过n (n

weixin_60530224的博客 2万+

树莓派学习系列7——GPIO基础

前言 原来学单片机的时候,就是通过一系列的引脚来控制单片机。终于学到了通过引脚来控制树莓派了。话不多说咱们先来了解基础。

我在等那么一天的博客 1万+

代码随想录算法训练营Day44 | 198.打家劫舍、213.打家劫舍II、337.打家劫舍 III

训练营第44天:198.打家劫舍、213.打家劫舍II、337.打家劫舍 III

jiabao0520的博客 966

ESP32与INMP441麦克风模块实现音频传输

ESP32是一款低成本、低功耗的物联网开发板,支持Wi-Fi和蓝牙双模通信,内置双核处理器,适合音频处理和实时数据传输。INMP441是一款高性能数字麦克风模块,支持I2S接口,可提供高精度音频数据采集(24-bit分辨率,64-100 dB SNR)。

走向CTO的路上... 2044

day39 | 198.打家劫舍 213.打家劫舍II 337.打家劫舍III

一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,小偷又发现了一个新的可行窃的地区。给定一个代表每个房屋存放金额的非负整数数组,计算你。给定一个代表每个房屋存放金额的非负整数数组,计算你。

m0_65709641的博客 895

Flow Matching05:概率路径与插值【概率路径:线性插值路径(最简单)、高斯插值路径】【先尝试线性插值,看效果如何;若不够好,尝试高斯插值】

好的,我将从数学角度详细解释Flow Matching,从高中生能理解的基础知识开始,逐步深入到高级概念。

u013250861的博客 174

数控系统(CNC)系列:Fanuc 31i-B_(5).基本操作与编程

Fanuc 31i-B 系统使用 G 代码和 M 代码进行编程。G 代码主要用于控制机床的运动,M 代码用于控制辅助功能,如冷却液开关、主轴启动等。G 代码:用于指定机床的运动方式。例如,G00 用于快速定位,G01 用于直线插补,G02 用于顺时针圆弧插补,G03 用于逆时针圆弧插补。M 代码:用于控制机床的辅助功能。例如,M03 用于启动主轴顺时针旋转,M05 用于停止主轴,M08 用于开启冷却液,M09 用于关闭冷却液。

2401_87715305的博客 1767

【LeetCode】337. House Robber III 打家劫舍 III(Medium)(JAVA)

【LeetCode】337. House Robber III 打家劫舍 III(Medium)(JAVA) 题目地址: https://leetcode.com/problems/house-robber-iii/ 题目描述: The thief has found himself a new place for his thievery again. There is only one entrance to this area, called the “root.” Besides the root,

qq_16927853的博客 224

【AI大模型:前沿】41、建筑行业大模型创业全指南:从技术突破到成本控制与落地路径

建筑行业大模型是“高门槛、高回报”的长周期赛道,适合有建筑行业资源+AI技术背景的团队切入。数据是基础,场景切割是策略,合规是底线。通过聚焦“设计生成+规范审查”等刚需场景,用“仿真数据+开源模型”降低成本,3-5年内有望成长为行业独角兽。对于中小团队,避开千万级全流程模型的红海,深耕“小而美”的单点工具,同样能实现盈利与快速扩张。关键成功公式建筑AI创业 = 50%数据壁垒构建 + 30%场景精准切入 + 20%成本控制能力。

2025博客之星Top81。专注AI工程化与架构实战。从分布式思维到模型部署,用工程化视角为你厘清AI落地的真实路径。 2115

打家劫舍系列 | Leetcode 198 | 213 | 337 | 动态规划 | 滚动数组

毛毛张今天分享的是动态规划中打家劫舍系列的题目!

神马都会亿点点的毛毛张 1254

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【刷题目录1】按标签刷LeetCode热题HOT100 java题解分类汇总

1.栈 2.堆 3.贪心算法 4.排序 5.位运算 6.树 7.深度优先搜索 8.广度优先搜索 9.并查集 10.图 11.设计

乾坤未定,你我皆是黑马 3466

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

leetcode刷题记录

刷题过程记录

洪肥肥的博客 2063

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Leetcode刷题java之337. 打家劫舍 III

执行结果: 通过 显示详情 执行用时 :1 ms, 在所有 Java 提交中击败了99.85% 的用户 内存消耗 :37.6 MB, 在所有 Java 提交中击败了72.38%的用户 题目: 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意...

逆水行舟,不进则退 563

LeetCode解析------337. 打家劫舍 III-树

题目: 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。 计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。 示例 1: 输入: [3,2,3,null,3,null,1] 3 / \ 2 3 \ \ 3 1 输出: 7

weixin_44337475的博客 250

代码随想录Day39 | 198.打家劫舍,213.打家劫舍II,337.打家劫舍III

在dfs的后序遍历位置进行判断,每个节点根据子节点能够盗取的最高金额进行判断。打家劫舍2,房屋成环,求两次打家劫舍1即可。一次不包括最后一个房屋,一次不包括第一个房屋。

weixin_43992121的博客 749

Java实现 LeetCode 337 打家劫舍 III(三)

337. 打家劫舍 III 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我...

Marcus 3380

LeetCode 337. 打家劫舍 III

LeetCode 337. 打家劫舍 III 文章目录LeetCode 337. 打家劫舍 III题目描述一、解题关键词二、解题报告1.思路分析2.时间复杂度3.代码示例2.知识点总结 题目描述 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。 除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。 给定二叉树的 root 。

Datao_csdn的博客 133

LeetCode 337 打家劫舍III

初始版本,会超时 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution {...

小黑屋 292

代码随想录算法训练营第 39 天 | 198. 打家劫舍、213. 打家劫舍 II、337. 打家劫舍 III

注意到情况二包含情况一的情况;情况三也包含情况一的情况。所以只有 2 种情况,取最大值即可。dp[i]:考虑第 i 间屋子能获得的最大价值。(注意只是考虑,不代表就一定选。为了解决首尾不能同时取的情况,将原情况分为 3 个子情况。每个节点有一个二维数组 dp。树形 dp + 后序遍历。

Unstoppable22的博客 316

Leetcode 第300,309,318,322,328,337,343,347,371,376题(Java解法)

Java解leetcode,助力面试之中等10道题(六)第300题 最长递增子序列解题思路代码第309题 最佳买卖股票时机含冷冻期解题思路代码第318题 最大单词长度乘积解题思路代码第322题 零钱兑换解题思路代码第328题 奇偶链表解题思路代码第337题 打家劫舍 III解题思路代码第343题 整数拆分解题思路代码第347题 前 K 个高频元素解题思路代码第371题 两整数之和解题思路代码第376题 摆动序列解题思路代码 第300题 最长递增子序列 示例 1: 输入 输出 interval

qq_42417189的博客 855

LeetCode337【动态规划】:打家劫舍Ⅲ

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

baidu_34209307的博客 263

leetcode热题HOT100汇总——java题解已完结撒花

为了学习本文捋顺leetcode热题HOT100的汇总 方便自己秋招刷题 仅作刷题笔记使用 感兴趣的小伙伴点一个赞吧。

qq_41810415的博客 9414
上一篇: java数据结构与算法刷题-----LeetCode687. 最长同值路径
下一篇: java数据结构与算法刷题-----LeetCode671. 二叉树中第二小的节点
ydenergy_殷志鹏
博客等级 码龄7年 5886粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值