【力扣每日一题】2023.9.18 打家劫舍Ⅲ

2023-09-18 12:30:16

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

今天是打家劫舍3,明天估计就是打家劫舍4了。

今天的打家劫舍不太一样,改成二叉树了,不过规则没有变,我们还是不能偷相邻的节点。

此时房屋的排序不是像之前那样是线性的了,也就是说我们无法使用之前的常规的动态规划来解决这道题,不过我们仍可以使用动态规划的思想来解决。

动态规划本质上就是状态转移。在线性排列的房屋之中,我们dp[ i ]等于截止到第 i 间房,我们能获取的最大的值是多少。

在二叉树之中我们同样也能沿用这个dp数组的含义,不过不同的是二叉树有些许不同,因为线性房屋相邻的房屋只有左右两个。而二叉树的节点中,相邻的有父节点和两个子节点一共三个。

在线性表中,我选择了下标为 i 的房间,我就不能选择 i - 1 和 i + 1 。

在二叉树中,我选择了一个节点,则它的左右子节点和父节点都不能选。

那么反过来呢?我不选择当前节点,那么我就可以选择左右两个子节点和父节点。

因为有两种情况,因此此时的dp数组应该是二维的,分别存放的是我选择当前节点所能获取的最大值以及我不选择当前节点所能获取的最大值。

现在我们来找找递推公式。

如果我选择当前节点,那么我能获取的最大值就是当前节点的值,以及左右两个子节点中不选择自己节点能获取到的最大值。

如果我不选择当前节点,那么我能获取的最大值就是左右两个子节点中,能获取的最大值。

以下动图以示例一为例,大家可以结合代码看看。

最后就是具体的做法,我们要求一个节点的能获取的最大值,我们就需要知道它的两个子节点能获取到的最大值,因此我们使用递归去遍历二叉树,至下而上去递推。

最终我们将根节点的能获取的最大值中(选择根节点能获取的最大值和不选择根节点能获取的最大值)取一个最大的返回出去。

代码:

class Solution {
public:
    //返回出去的数组一共两个元素,第一个表示偷本节点获取的最大值,第二个表示不偷本节点获取的最大值
    vector<int> find(TreeNode* root){
        //如果当前节点为空,那么偷与不偷都是0
        if(root==nullptr) return {0,0}; 
        auto l=find(root->left);
        auto r=find(root->right);
        //偷本节点获取的最大值就是本节点的值再加上两个子节点中不偷本节点的最大值(root->val+l[1]+r[1])
        //不偷本节点获取的最大值就是两个子节点中,分别取一个最大的值然后加起来.
        return {root->val+l[1]+r[1],max(l[0],l[1])+max(r[0],r[1])};
    }
    int rob(TreeNode* root) {
        vector<int>res=find(root);
        return max(res[0],res[1]);
    }
};

更多推荐

nova相机功能又㕛叒叕升级了!!!拍人像更自然

nova系列手机一直以其高颜值外观和性能体验,持续热销,成为当下年轻人追捧的手机之一。其出色的影像能力,无论是日常生活中的风景拍摄还是人物拍摄,都能够拍摄出非常清晰细腻的照片,同时还配备了多种摄影模式,让用户能够拍摄出更加专业和有创意的照片。而关于人像拍摄,广大用户如今更青睐于相对原生、人物真实且细节饱满的人像特写相片

棒球教学知识架构·棒球1号位

棒球教学知识架构1.棒球运动的基本认知棒球运动的起源和发展历程棒球运动起源于19世纪中叶的美国,最初是一种儿童游戏,使用木棒和石头或木头制成的球进行比赛。后来,人们开始使用橡胶球和棒子,并规定了比赛规则和场地标准,棒球运动逐渐发展成为一项正式的体育运动。随着时间的推移,棒球运动在美国和加拿大广受欢迎,并逐渐传播到世界各

Doris 2.0.1 Dockerfile制作

镜像编译准备工作1、创建目录└──docker-build//构建根目录└──fe//FE构建目录├──dockerfile//dockerfile脚本└──resource//资源目录├──init_fe.sh//启动及注册脚本└──apache-doris-x.x.x-bin-fe.tar.gz//二进制程序包mk

最新AI创作系统+ChatGPT商业运营源码+支持GPT4.0+支持国内AI模型/支持AI绘画

一、AI创作系统SparkAi系统是基于很火的GPT提问进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT系统?小编这里写一个详细图文教程吧!SparkAi程序使用Nestjs和Vue3框架

软件设计师笔记系列(一)

😀前言在日常生活和工作中,我们依赖于各种各样的计算机系统来完成一系列复杂的任务。计算机系统不仅仅是硬件设备的集合,它还包括一系列用于协调硬件工作的软件和协议。了解计算机系统的基础知识,包括其构造和功能,是理解现代技术世界的关键步骤。在这一章节中,我们将探讨计算机系统的核心组件和原理,从中央处理单元(CPU)的功能和组

Bash脚本学习:AWK, SED

1.AWKAWK是一种编程语言,设计用于处理文件或数据流中基于文本的数据,或者使用shell管道。可以将awk与shell脚本结合使用或直接在shell提示符下使用。以上展示使用AWK分别打印第一个位置变量和第二个位置变量。建立一个文档csvtest.csv。文档内容为:one,two,threeawk-F,'{pri

C语言每日一题(9):跳水比赛猜名次

文章主题:跳水比赛猜名次🔥所属专栏:C语言每日一题📗作者简介:每天不定时更新C语言的小白一枚,记录分享自己每天的所思所想😄🎶个人主页:[₽]的个人主页🏄🌊目录前言编程起因项目介绍设计思路1.整体逻辑2.具体逻辑代码展示效果展现结语前言编程起因最近牛客网刷到的一个编程题,综合运用了循环和条件判断语句,觉得该题

数据分享|R语言逻辑回归、线性判别分析LDA、GAM、MARS、KNN、QDA、决策树、随机森林、SVM分类葡萄酒交叉验证ROC...

全文链接:http://tecdat.cn/?p=27384在本文中,数据包含有关葡萄牙“VinhoVerde”葡萄酒的信息(点击文末“阅读原文”获取完整代码数据)。介绍该数据集(查看文末了解数据获取方式)有1599个观测值和12个变量,分别是固定酸度、挥发性酸度、柠檬酸、残糖、氯化物、游离二氧化硫、总二氧化硫、密度、

跨端开发方案之桌面应用小程序

小程序容器技术的未来是充满希望的,它为我们开辟了一个全新的数字世界,连接了桌面操作系统和移动生态系统之间的界限。正如技术不断演进,我们可以期待着更多的创新和发展,为用户带来更加便捷和多样化的应用体验。这一技术的推广和应用将继续推动数字科技的发展,塑造着未来的数字生活。QtGroup在提及2023年有桌面端应用程序开发热

【微服务实战之Docker容器】第四章-【微服务实战之Docker容器】第三章-镜像仓库

系列文章目录【微服务实战之Docker容器】第一章-下载及安装文章目录系列文章目录坑:容器卷记得加入以下命令配置是个啥?能干啥?基本的命令读写规则映射添加说明卷的继承和共享坑:容器卷记得加入以下命令配置--privileged=trueDocker挂载主机目录访问如果出现cannotopendirectory.:Per

第24章_瑞萨MCU零基础入门系列教程之内部温度传感器-TSN

本教程基于韦东山百问网出的DShanMCU-RA6M5开发板进行编写,需要的同学可以在这里获取:https://item.taobao.com/item.htm?id=728461040949配套资料获取:https://renesas-docs.100ask.net瑞萨MCU零基础入门系列教程汇总:https://b

热文推荐