当前位置: 首页 > news >正文

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

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

代码:

class Solution {
public://返回出去的数组一共两个元素,第一个表示偷本节点获取的最大值,第二个表示不偷本节点获取的最大值vector<int> find(TreeNode* root){//如果当前节点为空,那么偷与不偷都是0if(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]);}
};

http://www.lryc.cn/news/169965.html

相关文章:

  • Docker基础学习
  • esbuild中文文档-路径解析配置项(Path resolution - Alias、Conditions)
  • 您的应用存在隐藏最近任务列表名称的行为,不符合华为应用市场审核标准
  • Spring的 webFlux 和 webMVC
  • 【洛谷算法题】P5706-再分肥宅水【入门1顺序结构】
  • android studio环境搭建让你的开发之旅更加简单
  • Java面试_并发编程_线程基础
  • 基于Java的高校实习管理系统设计与实现(亮点:实习记录、实习打分、实习作业,功能新颖、老师没见过、当场唬住!)
  • 傅里叶变换
  • Vue Grid Layout -️ 适用Vue.js的栅格布局系统,在vue3+上使用
  • Electron(v26.2.1)无法加载React Developer Tools(v4.28.0)
  • 网站降权的康复办法(详解百度SEO数据分析)
  • 非对称加密、解密原理及openssl中的RSA示例代码
  • 基于springboot漫画管理系统springboot001
  • 【探索C++】string类详解
  • python 第一次作业
  • 个人博客网站一揽子:Docker建站(Nginx、Wordpress、MySql)
  • Unity 课时 4 : No.4 模拟面试题
  • Golang 基础面试题 01
  • 007-第一代软件需求整理
  • XMLHttpRequest介绍
  • 阿里云无影云电脑和传统PC有什么区别?
  • 基于matlab实现的船舶横摇运动仿真程序
  • Java手写二叉索引树和二叉索引树应用拓展案例
  • 大数据知识点之大数据5V特征
  • Java的Socket通信的断网重连的正确写法
  • Rocketmq--消息发送和接收演示
  • ArcGIS Pro将SHP文件转CAD并保留图层名称
  • GEE:使用for循环合成时间序列影像
  • flink1.13.2版本的对应的hive的Hcatalog的使用记录