代码随想录训练营第五十二天打卡|198.打家劫舍 213.打家劫舍II 337.打家劫舍III

198.打家劫舍

1.dp经典入门题目,dp[i]:考虑下标i(包括i)以内的房屋,最多可以偷窃的金额为dp[i]。dp[i]的值不一定是偷了下标为i的那一家,只是这一家能偷,如果不偷这一家能带来更高的收益,那就不偷。理解递推公式的时候应紧密联系定义,随想录中的考虑我觉得不够形象。事实上dp[0]和dp[1]不一定需要特判,可以通过在dp数组插入两个初始状态来使代码简洁,但我认为特判更好理解一点。(注:本题还可以通过两个变量来优化空间)

class Solution {
public:int rob(vector<int>& nums) {if (nums.size() == 1)return nums[0];vector<int> dp(nums.size(), 0);dp[0] = nums[0];dp[1] = max(nums[0], nums[1]);for (int i = 2; i < nums.size(); i++) {dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);}return dp[nums.size() - 1];}
};

213.打家劫舍II

1.本题是打家劫舍的进阶版,题解基本上都是把环拆开两次打劫取较大值。但为什么这样收益最大其实并没有说的很明白,我个人反复思考之后想出了一种自己觉得相对容易理解的解释。本题房屋是首尾相连的,第一家和最后一家不能同时偷。那么我先选择最后一家不偷,钱再多我也不偷,那么问题就退化成最初的打家劫舍版本。偷完之后我有点后悔,心里好像有只蚂蚁在爬,会不会最后一家钱很多呢?如果上天给我一次重来的机会,我选择不偷第一家,这样我就可以偷最后一家了,虽然不一定偷最后一家。这时候问题依然退化成最初的打家劫舍,比较两次收益,选取那个较大的。为什么这两种情况就包含了所有情况呢?考虑以上两种方案代表的是可以偷第一家和不可以偷第一家,或者说是不可以偷最后一家和可以偷最后一家,因此可以包含所有情况。(可以偷第一家不能偷最后一家,除了最后一家随便偷虽然不一定偷。不可以偷第一家可以偷最后一家,除了第一家随便偷虽然不一定偷)

class Solution {
public:int robRange(vector<int>& nums, int start, int end) {if (start == end)return nums[start];vector<int> dp(nums.size(), 0);dp[start] = nums[start];dp[start + 1] = max(nums[start], nums[start + 1]);for (int i = start + 2; i <= end; i++) {dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);}return dp[end];}int rob(vector<int>& nums) {if (nums.size() == 1)return nums[0];int result1 = robRange(nums, 0, nums.size() - 2);int result2 = robRange(nums, 1, nums.size() - 1);return max(result1, result2);}
};

337.打家劫舍III

1.记忆化递推,在递归的过程中我们会进行许多重复的计算导致超时,所以我们可以用map记录计算过的值,然后在出现重复计算时把之前的结果拿来用。(如果对重复计算不理解可参考这句话:我们计算了root的四个孙子(左右孩子的孩子)为头结点的子树的情况,又计算了root的左右孩子为头结点的子树的情况,计算左右孩子的时候其实又把孙子计算了一遍。)

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),* right(right) {}* };*/
class Solution {
public:unordered_map<TreeNode*, int> umap; // 记录计算过的结果int rob(TreeNode* root) {if (root == NULL)return 0;if (root->left == NULL && root->right == NULL)return root->val;if (umap[root])return umap[root]; // 如果umap里已经有记录则直接返回// 偷父节点int val1 = root->val;if (root->left)val1 += rob(root->left->left) +rob(root->left->right); // 跳过root->leftif (root->right)val1 += rob(root->right->left) +rob(root->right->right); // 跳过root->right// 不偷父节点int val2 = rob(root->left) + rob(root->right); // 考虑root的左右孩子umap[root] = max(val1, val2);                  // umap记录一下结果return max(val1, val2);}
};

2.树形DP。注意使用的后序遍历。 因为要通过递归函数的返回值来做下一步计算。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),* right(right) {}* };*/
class Solution {
public:int rob(TreeNode* root) {vector<int> result = robTree(root);return max(result[0], result[1]);}// 长度为2的数组,0:不偷,1:偷vector<int> robTree(TreeNode* cur) {if (cur == NULL)return vector<int>{0, 0};vector<int> left = robTree(cur->left);vector<int> right = robTree(cur->right);// 偷cur,那么就不能偷左右节点。int val1 = cur->val + left[0] + right[0];// 不偷cur,那么可以偷也可以不偷左右节点,则取较大的情况int val2 = max(left[0], left[1]) + max(right[0], right[1]);return {val2, val1};}
};

今日总结:打家劫舍。

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

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

相关文章

情人节到了,写一份爱心程序(python)

前言 情人节到了&#xff0c;写一份爱心代码给喜欢的人呀 公式 首先我们介绍下爱心的公式的参数方程&#xff1a; x 16 s i n 3 ( t ) x 16sin^3(t) x16sin3(t) y 13 c o s ( t ) − 5 c o s ( 2 t ) − 2 c o s ( 3 t ) − c o s ( 4 t ) y 13cos(t) - 5cos(2t) - 2co…

飞天使-k8s知识点17-kubernetes实操2-pod探针的使用

文章目录 探针的使用容器探针启动实验1-启动探针的使用-startupprobeLiveness Probes 和 Readiness Probes演示若存在started.html 则进行 探针的使用 kubectl edit deploy -n kube-system corednslivenessprobe 的使用 livenessProbe:failureThreshold: 5httpGet:path: /heal…

rtt设备io框架面向对象学习-pwm设备

目录 1.pwm设备基类2.pwm设备基类的子类3.初始化/构造流程3.1设备驱动层3.2 设备驱动框架层3.3 设备io管理层 4.总结5.使用 1.pwm设备基类 此层处于设备驱动框架层。该层的类也是抽象类。 在/ components / drivers / include / drivers 下的rt_drv_pwm.h定义了如下pwm设备基…

第三百四十八回

文章目录 1. 概念介绍2. 使用方法2.1 List2.2 Map2.3 Set 3. 示例代码4. 内容总结 我们在上一章回中介绍了"convert包"相关的内容&#xff0c;本章回中将介绍collection.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的内容是col…

华为OD机试真题-最大N个数与最小N个数的和-2024年OD统一考试(C卷)

题目描述: 给定一个数组,编写一个函数来计算它的最大N个数与最小N个数的和。你需要对数组进行去重。 说明: 数组中数字范围[0, 1000] 最大N个数与最小N个数不能有重叠,如有重叠,输入非法返回-1 输入非法返回-1 输入描述: 第一行输入M, M标识数组大小\n第二行输入M个数,标…

【无人机】PIXHAWK、PX4、APM区别

PIXHAWK、PX4、APM APM固件专为Arduupilot开发的固件&#xff0c;现也用于PIXHAWK。有ArduCopter社区支撑、开放&#xff0c;功能全、迭代升级快&#xff0c;适合直接用。由于有较多的历史兼容性需求&#xff0c;软件代码体系相对杂乱&#xff0c;还封装了PX4的内核&#xff0c…

【数据结构】无向图创建邻接矩阵、深度优先遍历和广度优先遍历(C语言版)

无向图创建邻接矩阵、深度优先遍历和广度优先遍历 一、概念解析&#xff1a; &#xff08;1&#xff09;无向图&#xff1a;&#xff08;2&#xff09;邻接矩阵&#xff1a; 二、创建邻接矩阵&#xff1a;三、深度遍历、广度遍历 &#xff08;1&#xff09;深度遍历概念&#x…

学习笔记18:Codeforces Round 923 (Div. 3)

D 预处理&#xff0c;ans[i]记录一a[i]后面第一个与a[i]相等的值&#xff08;如果没有&#xff0c;则需要特殊判断或者初始化成一个极大值&#xff09; 每次询问时&#xff0c;可以直接看ans[l]是否大于r&#xff0c;如果大于则不存在&#xff0c;如果小于则存在 #include&l…

用HTML5实现动画

用HTML5实现动画 要在HTML5中实现动画&#xff0c;可以使用以下几种方法&#xff1a;CSS动画、使用<canvas>元素和JavaScript来实现动画、使用JavaScript动画库。重点介绍前两种。 一、CSS动画 CSS3 动画&#xff1a;使用CSS3的动画属性和关键帧&#xff08;keyframes&…

Fluke ADPT 连接器新增对福禄克万用 Fluke 17B Max 的支持

所需设备&#xff1a; 1、Fluke ADPT连接器&#xff1b; 2、Fluke 17B Max&#xff1b; Fluke 17B Max拆机图&#xff1a; 显示界面如下图&#xff1a; 并且可以将波形导出到EXCEL: 福禄克万用表需要自己动手改造&#xff01;&#xff01;&#xff01;

Spring Boot 笔记 020 redis集成

1.1 安装redis Windows 下 Redis 安装与配置 教程_redis windows-CSDN博客 2.1 引入redis坐标 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 2.2 配置…

无人机导航技术,无人机导航理论基础,无人机导航技术应用发展详解

惯性/卫星定位组合是一种比较理想的组合导航系统。在无人机导航领域&#xff0c;多年来惯性/卫星定位组合导航系统的研究一直受到普遍的关注&#xff0c;大量的理论研究成果得到实际应用。 常见的几类导航系统 单一导航 卫星导航系统 、多普勒导航、惯性导航系统(INS) 、图形…

【Java多线程】对进程与线程的理解

目录 1、进程/任务&#xff08;Process/Task&#xff09; 2、进程控制块抽象(PCB Process Control Block) 2.1、PCB重要属性 2.2、PCB中支持进程调度的一些属性 3、 内存分配 —— 内存管理&#xff08;Memory Manage&#xff09; 4、线程&#xff08;Thread&#xff09;…

蓝桥杯每日一题(python)

##斐波那契数列的应用 --- 题目斐波那契 题目&#xff1a; 如果数组 A (a0, a1, , an−1) 满足以下条件&#xff0c;就说它是一个斐波那契数组&#xff1a; 1. n ≥ 2&#xff1b; 2. a0 a1&#xff1b; 3. 对于所有的 i(i ≥ 2)&#xff0c;都满足 ai ai−1 ai−2…

阿里云幻兽帕鲁服务器更新了1.4之后,进游戏要重新创建角色,怎么解决?

阿里云幻兽帕鲁服务器更新了1.4之后&#xff0c;进游戏要重新创建角色&#xff0c;怎么解决&#xff1f; 其实这个问题的主要原因可能还是因为前后的APPID不一致导致。 因为Palworld服务端有两种&#xff0c;一种是有APPID&#xff0c;还有一种是没有APPID。 参考这篇教程&am…

曝某头部电商企业急招鸿蒙开发高手 年薪超过百万

近日某头部电商企业急需鸿蒙开发高手&#xff0c;提供高达100万的年薪&#xff0c;工作地点位于北京。 随着鸿蒙生态不断发展壮大&#xff0c;越来越多的企业开始加入其中&#xff0c;对鸿蒙OS开发工程师的需求也越来越迫切。据新浪科技报道&#xff0c;多家互联网公司相继发布…

gem5学习(20):替换策略——Replacement Policies

目录 一、Random 二、Least Recently Used (LRU) 三、Tree Pseudo Least Recently Used (TreePLRU) 四、Bimodal Insertion Policy (BIP) 五、LRU Insertion Policy (LIP) 六、Most Recently Used (MRU) 七、Least Frequently Used (LFU) 八、First-In, First-Out (FIF…

cefsharp121(cef121.3.7Chromium121.0.6167.160)升级测试及其他H264版本

一、版本说明 1.1 本此版本 此版本CEF 121.3.7+g82c7c57+chromium-121.0.6167.160 / Chromium 121.0.6167.160 1.2 其他支持H264版本 支持H264推荐版本:V100,V109,V111,V119版本,其他V114,V115,V108,V107 支持win7/win8/win8.1最后版本v109.x 支持NET4.5.2最后版本v114.x …

如何合理评估信号过孔的残桩效应--Via Stub

设计中&#xff0c;之所以会去考察信号过孔的残桩效应&#xff08;Via Stub&#xff09;&#xff0c;是因为它的存在导致了不需要的频率谐振&#xff0c;当这些谐振出现在所关注的信号通道的插入损耗中时&#xff0c;就会引发较为严重的信号完整性&#xff08;SI&#xff09;问…

python---Pixiv排行榜图片获取(2024.2.16)

1.提示&#xff1a; 使用需要安装各种import的包&#xff0c;都是很基础的包&#xff0c;直接安装即可。 自备梯子 。 2.严肃警告 本程序仅可用作个人爱好&#xff0c;商业用途严禁&#xff01;请自觉遵守君子协定robots.txt不要给网址过大的压力&#xff0c;每天以及同一时段…