力扣337-打家劫舍 III(Java详细题解)

news2024/11/19 17:19:59

题目链接:337. 打家劫舍 III - 力扣(LeetCode)

前情提要:

本体是打家劫舍的一个变形题,希望大家能先做198. 打家劫舍 - 力扣(LeetCode),并看一下我上题的讲解力扣198-打家劫舍(Java详细题解)-CSDN博客,再看本题会觉得好一点。

因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。

dp五部曲。

1.确定dp数组和i下标的含义。

2.确定递推公式。

3.dp初始化。

4.确定dp的遍历顺序。

5.如果没有ac打印dp数组 利于debug。

每一个dp题目如果都用这五步分析清楚,那么这道题就能解出来了。

题目思路:

本题是将二叉树和dp结合的一道题目,刚开始做这种题目的朋友可能会很懵,普通的dp我会呀,但是结合二叉树就不知道怎么入手了。

没关系,我带大家梳理一下思路。

既然是二叉树类的题目,那么难免要进行二叉树的遍历。

本题二叉树遍历是哪一种?

由题目描述可以看出,每一个节点就是一间房间,俩个相邻的房间不能同时偷。

意思就是俩个相连的节点就不能偷,再深入点就是当前节点如果已经偷了,那么他的子节点是不能偷的,如果当前节点不偷,那么他的左右孩子是可以考虑偷的。

所以该题是用后序遍历的,我们要根据他的左右孩子节点的状态来推出他父节点的状态。

该题也与打家劫舍1和2的状态一样,每个节点都有俩种状态,选或不选。

所以每一层我们就用dp数组来表示我们的状态,dp[0] 表示不偷本节点的子树结构的最高金额,dp [1] 表示偷本节点的子树结构的最高金额。

肯定会有人疑问,dp数组怎么就记录每个节点的偷窃状态,那我其他节点的怎么处理。其实这就是我们要用后序遍历的一个好处了,后序遍历可以优先处理左右孩子节点的情况,然后将左右孩子节点的返回值返回给中间节点处理。

意思就是本层的递归值中就有我孩子节点的状态,我可以用我孩子节点的状态来推出我本层节点的状态。

可能这里大家看起来有点懵,后序看代码就清晰很多了。

接下来我们用动规五部曲来系统分析一下。

1.确定dp数组和i下标的含义。

dp[0] 就是以该节点为“根节点”的树结构不考虑偷所得的最大金额。

dp[1] 就是以该节点为“根节点”的树结构考虑偷所得的最大金额。

2.确定递推公式。

本层节点不偷,那我就可以考虑我左右孩子节点偷。

注意我这里都是考虑,都不一定非要偷,偷不偷不是我决定的,而是递推公式找出最大值来确定偷不偷。

dp[0] = Math.max(left[0],lefr[1]) + Math.max(right[0],right[1]);

这里的left[]其实就是我左孩子节点的dp状态数组,right就是我右孩子节点的dp状态数组。我左右孩子分别考虑偷或不偷,取一个最大即可。

所以这里就可以看出我们只用给每一个节点设立dp数组就可以,左右孩子节点可以由递归返回值得出。

本层节点偷,那我左右孩子节点肯定就不能偷了对吧。

那我就将本层节点的值和左右孩子不能偷的最大金额加上即可。

dp[1] = root.val + left[0] + right[0];

3.dp初始化。

其实本题的初始化就是给那些空节点进行初始化。因为是后序遍历,回溯时需要从后往前推。

那么递归碰到空节点时就会停止,从而回溯往前推,所以递推的初始值就是空节点的值。

空节点初始化为什么呢?想想dp数组的定义。我当前节点都为空了 我偷不偷都会0。所以初始化为{0,0}

4.确定dp的遍历顺序。

这里就不说dp的遍历顺序,还是二叉树的遍历顺序,因为是在树结构上进行递推,所以是以树的遍历顺序为主。

本题遍历顺序后序。

5.如果没有ac打印dp数组 利于debug。

在这里插入图片描述

最终代码:

/**
 * 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) {
        
        //面对二叉树问题 我们首先想到的就是遍历顺序 这道题我们是采用前中后序还是层序呢?
        //该题我们要考虑左右孩子的被打劫的情况再考虑本节点的情况,所以本题要采用后序遍历。
        //后序遍历的特点就是将左右孩子节点的情况反馈给本节点 然后再做处理.
        //该题也与前俩个打家劫舍的状态一样,每个节点都有俩种状态,选或不选。
        //所以每一层我们就用dp数组来表示我们的状态,dp【0】表示不偷本节点的子树结构的最高金额,dp[1]表示偷本节点的子树结构的最高金额
        //那么肯定有疑问 这个dp数组怎么记录每个节点的状态。这是因为本层的递归返回值中就有你孩子节点的状态,你可以利用你孩子节点状态来推出你本层节点的状态。
        //当我们把整个树遍历完了后,这棵树的最终结果就在根节点处。
        int [] result = robTree(root);
        return Math.max(result[0],result[1]);
    }

    public int[] robTree(TreeNode root){
        //定义dp数组
        int dp[] = new int[2];
        if(root == null)return dp;
        //遍历顺序 左 右 中
        int[] left = robTree(root.left);
        int[] right = robTree(root.right);
        //不偷本节点的状态
        //那我就要考虑我的左右孩子节点是否要偷
        dp[0] = Math.max(left[0],left[1]) + Math.max(right[0],right[1]);
        //偷本节点的状态
        //我的左右孩子节点肯定不能偷
        dp[1] = root.val + left[0] + right[0];
        //本节点考虑完了往上层返回值
        return dp;
    }
}

这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。

我很乐意为你解答。那么我们下篇再见!

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

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

相关文章

【刷题】Day 3--错误的集合

hello!又见面啦~~~ 一道习题,要长脑子了...... 【. - 力扣(LeetCode)】 【思路】 /*** Note: The returned array must be malloced, assume caller calls free().*/void Bubble_sort(int arr[], int size) {int temp;for (int i…

多速率信号处理-CIC滤波器

基本原理 级联积分梳状滤波器(Cascade Intergrator Comb)是多速率信号处理中一种十分高效的数字滤波器。CIC滤波器具有低通滤波器的特性,同时具有以下优势: 滤波器系数全为1,设计时不需要存储滤波器系数,…

拖放WORD文件朗读全文

把WORD拖放到tkinter的窗口,就可以朗读整改word文件的内容。 代码: # -*- coding: utf-8 -*- """ Created on Tue Sep 10 17:09:35 2024author: YBK """ import pyttsx3 import comtypes.client import os import tkint…

按包边(边框)尺寸分类异形创意圆形(饼/盘)LED显示屏有哪些种类

在LED显示屏技术日新月异的今天,异形创意圆形(饼/盘)LED显示屏凭借其独特的形态设计与广泛的应用场景,成为了商业展示、舞台表演、艺术装置以及户外广告等领域的宠儿。其中,按包边(边框)尺寸的不…

holynix靶机详解

靶机配置 加一个网络适配器(网卡) 修改MAC地址 00:0C:29:BC:05:DE 原来的网卡设置为桥接,随机生成MAC地址 重启靶机即可扫到靶机IP 主机探测与端口扫描 arp-scan -l 发现开放80端口 nmap -sV -A -T4 192.168.229.153 访问网站 http://1…

OpenAI O1:人工智能推理能力的新里程碑

引言 北京时间9月13日凌晨,OpenAI在没有任何预告的情况下,正式发布了其首款具有推理能力的模型——OpenAI O1。这一模型的发布,不仅标志着人工智能能力的新水平,也预示着AI技术发展的新范式。本文将详细解析OpenAI O1模型的技术特…

【计网】数据链路层:概述之位置|地位|链路|数据链路|帧

✨ Blog’s 主页: 白乐天_ξ( ✿>◡❛) 🌈 个人Motto:他强任他强,清风拂山岗! 💫 欢迎来到我的学习笔记! ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ 1. 在OSI体系结构中的位置 1. 位置:数…

每日一练:K个一组翻转链表

25. K 个一组翻转链表 - 力扣(LeetCode) 一、题目要求 给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。 k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#x…

时间复杂度计算 递归

我们先拿出 2021 csp-s 程序题中一道看着就头大的程序题,要求分析 solve1 的复杂度。 设 T(n) ⁡ \operatorname{T(n)} T(n) 表示数组长度为 n n n 时的复杂度(即 m − h 1 n m-h1n m−h1n)。 T ( 1 ) 1 T(1)1 T(1)1,根据…

计算机毕业设计 酷听音乐系统的设计与实现 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

【SQL】百题计划:SQL排序Order by的使用。

简述: 排序函数:Order by;升序 ASC;降序 DESC; 答案: Select distinct author_id as id from Views where author_id viewer_id order by id Asc;

关于华大/小华 HC32F460 在IAR环境中,无法启用FPU 硬件浮点运算单元的解决方案

需求:要使用浮点FFT功能,面开启M4的 FPU功能 问题:无法开启 FPU,如下图所示:此栏为灰色,无法选择 尝试强制增加 __ARMVFP__: 编译出错,无法内链FPU: 解决方案&#xff1…

[000-01-008].第05节:OpenFeign高级特性-日志打印功能

我的后端学习大纲 SpringCloud学习大纲 1、日志打印功能: 1.Feign 提供了日志打印功能,我们可以通过配置来调整日志级别,从而了解 Feign 中 Http 请求的细节,说白了就是对Feign接口的调用情况进行监控和输出 2、日志级别: NONE&…

vue3【实战-组件封装】图文卡片

效果预览 技术要点 图片宽高比固定为 16:9,展示方式为 object-fit: cover通过 v-bind 实现父组件向子组件的批量传参单行文本超长显示省略号 white-space: nowrap; overflow: hidden; text-overflow: ellipsis; title 属性实现鼠标悬浮显示文本完整内容 范例代码 …

HarmonyOS开发之使用Picker(从相册选择图片),并且通过Swiper组件实现图片预览

一:效果图: 二:添加依赖 import picker from ohos.file.picker; 三:创建showDialog showDialog() {AlertDialog.show({message: 从相册选择,alignment: DialogAlignment.Bottom,offset: { dx: 0, dy: -12 },primaryButton: {val…

Java面试、技巧、问题、回复,资源面面观

入门 先了解一下面试流程 复习 Java 基础知识: 温习 Java 编程的核心概念,包括数据类型、变量、循环、数组和面向对象的编程原则。数据结构和算法: 加强您对 Java 编程中使用的基本数据结构和算法的理解。练习编码: 在各种平台上解…

PHP一键约课高效健身智能健身管理系统小程序源码

一键约课,高效健身 —— 智能健身管理系统让健康触手可及 🏋️‍♀️ 告别繁琐,一键开启健身之旅 你还在为每次去健身房前的繁琐预约流程而烦恼吗?现在有了“一键约课高效健身智能健身管理系统”,所有问题都迎刃而解…

YARN----调度策略

Yarn中,负责给应用分配资源的就是Scheduler 在Yarn中有三种调度器可以选择:FIFO Scheduler ,Capacity Scheduler,Fair Scheduler FIFO Scheduler 先进先出策略 在进行资源分配的时候,先给队列中最先上的应用进行分配…

springboot从分层到解耦

注释很详细,直接上代码 三层架构 项目结构 源码: HelloController package com.amoorzheyu.controller;import com.amoorzheyu.pojo.User; import com.amoorzheyu.service.HelloService; import com.amoorzheyu.service.impl.HelloServiceA; import o…

GoogleSQL:SQL 中的 Pipe 语法

这些是我根据论文 SQL Has Problems 编写的笔记。我们可以修复它们:SQL 中的 Pipe 语法 TL博士 SQL 长期以来一直是结构化数据处理的主导语言,通过本文,GoogleSQL 团队引入了一种新的管道结构化数据流语法,该语法显著提高了 SQL …