代码随想录Day51

news2024/11/16 23:46:30

今天继续学习动规解决相关问题。

337.打家劫舍|||

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

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

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

示例 1:

 

输入: root = [3,2,3,null,3,null,1]
输出: 7 
解释: 小偷一晚能够盗取的最高金额 3 + 3 + 1 = 7

思路:

1.本题是第一次接触动规与二叉树结合起来的题目,一开始确实没什么思路。最初想到完全用递归二叉树的方式来做,但最后很不幸超时了。

2.尽管纯递归超时了,但既然本题是二叉树那就一定涉及到递归。在通过观看讲解视频后发现,纯递归的方法会有多次重复的运算做了无用功,且一直都是实时运算的,因此考虑使用动规的方法来解决。

3.既然选择要用动规,那么dp数组如何确定呢?本题需要存储每一个结点取或者不取的情况,因此我们为每一个结点创建一个dp数组用于存储当前结点取或不取的情况,因此dp数组长度为2,我们规定dp[0]为不取当前结点的最大金额,dp[1]为取当前结点的最大金额

4.然后我们按照递归的思路来想一想递归的顺序,本题如果从根节点从上往下进行遍历,一开始考虑取或不取就会比较复杂,因此我们选择后序遍历,从叶子结点开始向上逐步递归会更加简单,而且当前结点取或不取,其取值实际上也受到下面的孩子节点的影响。

5.然后关于递推公式,如果当前结点取,那么首先要加上当前结点的值,然后加上不取左右孩子的情况下左右孩子各自的最大金额;如果当前结点不取,那么直接等于左右孩子取或不取的最大值之和。(这里可能有点抽象,建议配合代码观看)

class Solution {
public:
    //dp数组就是长度为2的返回值,dp[0]代表不取当前结点的最大金额,dp[1]代表取当前结点的最大金额
    vector<int> robTree(TreeNode* cur){
        //空结点直接返回[0,0]
        if(cur == nullptr) return vector<int>{0,0};

        vector<int> leftRob = robTree(cur->left);//左
        vector<int> rightRob = robTree(cur->right);//右
        //中
        int val1 = cur->val + leftRob[0] + rightRob[0];//取当前结点的最大金额
        int val2 = max(leftRob[0], leftRob[1]) + max(rightRob[0], rightRob[1]);//不取当前结点的最大值

        return vector<int>{val2, val1};
    }

    int rob(TreeNode* root) {
        vector<int> result = robTree(root);

        return max(result[0], result[1]);
    }
};

启发:

1.本题作为初次接触二叉树融合动规的题目,给人一种无从下手的感觉,因为Day50的打家劫舍|和打家劫舍||实则都是转化为相对简单的线性结构来解决,但本题数据结构为二叉树,必须得通过递归的方式来遍历二叉树,而其中涉及到动规最难想的主要还是dp数组是什么及其含义,本题为了避免重复计算确实需要一个容器来存储我们中途运算的结果,而本题的dp数组就当仁不让充当了这样的一种容器,因此dp数组长度为2且每个节点都有一个自己的dp数组对应其取或不取的情况。

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

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

相关文章

【RabbitMQ学习日记】—— 初识RabbitMQ

一、消息队列 1.1 MQ的相关概念 1.1.1 什么是MQ MQ(message queue)&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO 先入先出&#xff0c;只不过队列中存放的内容是 message 而已&#xff0c;还是一种跨进程的通信机制&#xff0c;用于上下游传递消息。…

MinIO从信息泄漏到RCE

文章目录信息泄露漏洞利用漏洞分析漏洞修复RCE漏洞分析参考文章信息泄露 漏洞利用 如果MinIO以集群方式部署&#xff0c;存在信息泄露漏洞&#xff0c;攻击者可以通过HTTP请求获取目标进程的所有环境变量&#xff0c;包括MINIO_SECRET_KEY和MINIO_ROOT_PASSWORD. vulhub有环…

paddle实现手写数字识别模型继续解读

要点&#xff1a; 手写数字识别用简单的线性进行分类效果比较差&#xff0c;添加卷积层和池化层效果会相对较好。参考文档&#xff1a;百度官方文档 一 网络结构 前几节我们尝试使用与房价预测相同的简单神经网络解决手写数字识别问题&#xff0c;但是效果并不理想。原因是手…

ROS开发之如何使用常用可视化工具?

文章目录0、引言1、rqt工具2、RViz工具3、Gazebo工具0、引言 笔者因研究课题涉及ROS开发&#xff0c;学习了古月居出品的ROS入门21讲&#xff0c;为巩固可视化工具的知识&#xff0c;本文将ROS的常用可视化工具使用一讲内容进行总结。    1、rqt工具 在终端输入&#xff1a;…

图解二叉搜索树

gitee代码:https://gitee.com/WangZihao64/data-structure-and-algorithm/tree/master/BST 一、概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值…

网站怎么接入chatGPT来自动写文章

用chatGPT写文章接入网站 将ChatGPT集成到网站中&#xff0c;可以让用户在网站上快速、简便地生成文章&#xff0c;并且可以提高用户体验。以下是一些用ChatGPT写文章接入网站的方法&#xff1a; 使用ChatGPT API接口&#xff1a;OpenAI提供了GPT-3 API接口&#xff0c;您可以…

c++11 常用新特性大总结

1.统一的初始化列表 在c98中我们经常会用{}初始化数组&#xff0c;而为了更近一步初始化我们在c11中采用{}的形式&#xff0c;代替等于号来帮助我们初始化的进行 举个例子&#xff1a; struct Point {int _x;int _y; }; int main() {int array1[] { 1, 2, 3, 4, 5 };int ar…

2023年七大最佳勒索软件解密工具

勒索软件是目前最恶毒且增长最快的网络威胁之一。作为一种危险的恶意软件&#xff0c;它会对文件进行加密&#xff0c;并用其进行勒索来换取报酬。 幸运的是&#xff0c;我们可以使用大量的勒索软件解密工具来解锁文件&#xff0c;而无需支付赎金。如果您的网络不幸感染了勒索软…

【MySQL】实验七 视图

文章目录 1. 建立city值为上海、北京的顾客视图2. 建立城市为上海的客户2016年的订单信息视图3. SQL视图:建立视图AVG_CJ4. SQL视图:建立视图IS_STUDENT5. SQL视图:建立视图CJ_STUDENT6. SQL视图:根据视图CJ_STUDENT创建视图CJ_TJ1. 建立city值为上海、北京的顾客视图 建立…

webgl-画一个彩色矩形

html <!DOCTYPE html> <head> <style> *{ margin: 0px; padding: 0px; } </style> </head> <body> <canvas id webgl> 您的浏览器不支持HTML5,请更换浏览器 </canvas> <script src"./main.js"></script&g…

基于七牛云和PicGo的图床搭建

第一次搭建的博客因为误操作且没有备份导致无法访问和恢复。第二次搭建吸取了第一次的错误&#xff0c;并且准备用图床进行图片的访问。 需要用到的&#xff1a; 七牛云&#xff0c; PicGo&#xff0c; Typora&#xff0c; 已备案域名。 七牛云和域名 进入七牛云的页面&…

Nginx 服务器 SSL 证书安装部署

工具&#xff1a;WinSCP、putty 1.下载证书 cloud.tencent.com_bundle.crt 证书文件cloud.tencent.com_bundle.pem 证书文件&#xff08;可忽略该文件&#xff09;cloud.tencent.com.key 私钥文件cloud.tencent.com.csr CSR 文件 2.上传证书到服务器 通过WinSCP将已获取到的…

Linux宝塔面板搭建Discuz论坛, 并公网远程访问【内网穿透】

文章目录前言1.安装基础环境2.一键部署Discuz3.安装cpolar工具4.配置域名访问Discuz5.固定域名公网地址6.配置Discuz论坛前言 Crossday Discuz! Board&#xff08;以下简称 Discuz!&#xff09;是一套通用的社区论坛软件系统&#xff0c;用户可以在不需要任何编程的基础上&…

paddle实现手写数字识别终章

要点&#xff1a; 资源配置训练调试恢复训练模型部署参考文档&#xff1a; paddle官方文档 一 资源配置 1 概述 从前几节的训练看&#xff0c;无论是房价预测任务还是MNIST手写字数字识别任务&#xff0c;训练好一个模型不会超过10分钟&#xff0c;主要原因是我们所使用的神…

T 级数据量迁移!知名云巨头如何从 Jira 切换至 ONES?

2021 年&#xff0c;Atlassian 旗下 Jira&Confluence 等系列产品 Server 版&#xff08;本地私有化部署版&#xff09;全面停售&#xff0c;并将在 2024 年停止维护&#xff0c;Server 版客户必须迁移至 Cloud&#xff08;云&#xff09;或 Data Center&#xff08;数据中心…

最新阿里、腾讯、华为、字节等大厂的薪资和职级对比,看看你差了多少...

互联网大厂新入职员工各职级薪资对应表(技术线)~ 最新阿里、腾讯、华为、字节跳动等大厂的薪资和职级对比 上面的表格不排除有很极端的收入情况&#xff0c;但至少能囊括一部分同职级的收入。这个表是“技术线”新入职员工的职级和薪资情况&#xff0c;非技术线(如产品、运营、…

Unicode 编码表

正则查找: 中文文字中文符号表情符号... [^\x00-\xff] 其中 \x00-\xff 匹配 ASCII 代码中十六进制代码为 00-ff 的字符&#xff0c; 加个取反 ^ &#xff0c;则就表示表示匹配非单字节的字符&#xff0c;例如汉字&#xff0c;汉字符号等字符集。 中文文字&#xff08;简体繁…

python形态学滤波:腐蚀、膨胀、开、闭运算

文章目录二值形态学灰度形态学最基础的形态学操作有四个&#xff0c;分别是腐蚀、膨胀、开计算和闭计算&#xff0c;scipy.ndimage分别实现了二值数组和灰度数组的这四种运算 二值灰度binary_erosiongrey_erosion腐蚀binary_dilationgrey_dilation膨胀binary_closinggrey_clos…

快速部署专业领域AI处理网站

当前AI大型语言模型展示了很强的信息整合与处理能力&#xff0c;但一些专业知识方面的问答知识量还不够完善&#xff0c;我们在AI的基础上增加了内容训练数据库&#xff0c;相关内容自动添加到AI内容数据库索引。在使用时&#xff0c;可以实时根据对话内容进行检索调取相关上下…

谷歌发布Self-Debug方法,让大模型学会自己修bug,一次性生成正确代码

文 | 智商掉了一地你有没有想过&#xff0c;让一台计算机诊断和修复自己生成的错误代码&#xff1f;一篇最新的研究论文介绍了一种名为 Self-Debugging 的技术&#xff0c;通过在生成的代码中添加自解释的信息&#xff0c;让计算机像一个可以自己修复代码的程序员一样调试自己的…