代码随想录算法训练营第四十八天|198.打家劫舍、213.打家劫舍II、337.打家劫舍III
创始人
2025-05-31 22:53:56
0

LeetCode 198 打家劫舍

题目链接:https://leetcode.cn/problems/house-robber/

思路:

  • dp数组的含义

dp[i]表示前i个房间(包括第i个房间)所能偷到的最大金额

  • 递推公式

有两种情况:

1、偷了第i个房间

那么此时第i-1个房间肯定是不偷的,所以

2、没有偷第i个房间

那么有可能偷了第i-1个房间,所以此时

因为求的是最大金额,所以二者要求最大值

  • 初始化

由递推公式可知,显然需要初始化dp[0]和dp[1],dp[0]=nums[0],dp[1]=max(nums[0],nums[1])

  • 遍历顺序

因为dp[i]依赖于dp[i-1]和dp[i-2],所以必然是从前往后遍历

代码:

class Solution {
public:int rob(vector& nums) {if(nums.size() == 1)    return nums[0];vectordp(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]);}for(int i = 0; i < dp.size(); i++)cout << dp[i] << " ";cout << endl;return dp[nums.size() - 1];}
};

总结

自己写的时候,dp数组的含义定义错误了

LeetCode 213 打家劫舍II

题目链接:https://leetcode.cn/problems/house-robber-ii/

思路:

本题要分成两种情况来讨论:

1、考虑包含头元素,不包含尾元素

2、考虑包含尾元素,不包含头元素

最后求两种情况的最大值即为答案。

注:“考虑"不代表必须要选,例如情况二,虽然是考虑包含尾元素,但不一定要选尾部元素! 对于情况二,取nums[1] 和 nums[3]就是最大的。

代码:

class Solution {
public:int rob(vector& nums) {if(nums.size() == 1)    return nums[0];if(nums.size() == 2)    return max(nums[0], nums[1]);int result1 = robRange(nums, 0, nums.size() - 2);   // 不包含尾元素的情况int result2 = robRange(nums, 1, nums.size() - 1);   // 不包含头元素的情况return max(result1, result2);}int robRange(vector&nums, int start, int end){vectordp(nums.size(), 0);dp[start] = nums[start];dp[start + 1] = max(nums[start],nums[start + 1]);for(int i = 2; i <= end; i++){dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);}return dp[end];}};

总结

学会了数组环形要如何解决

LeetCode 337 打家劫舍III

题目链接:https://leetcode.cn/problems/house-robber-iii/

思路:

  • dp数组的含义

dp[0]代表不偷该节点时的最大金额

dp[1]代表偷该节点时的最大金额

  • 遍历顺序

首先明确的是使用后序遍历。 因为要通过递归函数的返回值来做下一步计算。

通过递归左节点,得到左节点偷与不偷的金钱。

通过递归右节点,得到右节点偷与不偷的金钱。

  • 单层递归逻辑

1、不偷当前节点

那么此时就可以选择偷和不偷左右节点。

2、偷当前节点

那么就是选择不偷左右子树

  • 举例推导

代码:

/*** 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) {vectorresult = robTree(root);return max(result[0], result[1]);}vector robTree(TreeNode *cur){if(cur == nullptr) return vector(2, 0);// 后续遍历vectorleftdp = robTree(cur -> left);vectorrightdp = robTree(cur -> right);int val0 = max(leftdp[0], leftdp[1]) + max(rightdp[0], rightdp[1]);int val1 = cur->val + leftdp[0] + rightdp[0];return vector{val0, val1};}
};

总结

dp和树结合的一道题

今日总结:

三道打家劫舍的题目对应了普通数组情况,环形情况和树形情况。其中环形情况和树形情况需要多加练习和理解。

相关内容

热门资讯

视频丨“新国补”政策落地 消费... 新年伊始,河南积极落实2026年国家“以旧换新”补贴新政,迅速释放政策红利,汽车、电子消费品等市场消...
万盛股份:短期承压不改龙头本色... 1月11日,万盛股份(603010.SH)发布2025年度业绩预报。2025年度,受国际地缘冲突、欧...
国新国证基金总经理谌重离任;跨... 每经记者|肖芮冬 每经编辑|叶峰 天赐良基日报第805期 一、今日基金新闻速览 1、国新国证基金...
从80%提高至100%,沪深北... 1月14日午间,沪深北交易所宣布上调融资保证金最低比例,旨在通过逆周期调节降低市场杠杆水平,此次调整...
沪深北交易所通知:融资保证金比... 2026年1月14日,经中国证监会批准,沪深北交易所发布通知调整融资保证金比例,将投资者融资买入证券...
掌上工美APP是骗局?上海工美...   当前网络上许多所谓的“现货交易”,实质上属于变相期货交易。所谓“变相期货”,是指在未获得国家相关...
原创 2... 22美元进,84美元出?这是特朗普在2026年1月12日发表的惊人言论,关于他计划抢购委内瑞拉的石油...
人去楼空,杉杉集团上海总部大楼... 2026年1月13日,君康金融广场在阿里拍卖二次上拍,起拍价18.1亿元。据显示,此前1月8日起拍价...
唐珂任中国电信集团有限公司董事... 2026年开年之际,中国电信集团有限公司(以下简称“中国电信”)迎来重要人事调整。原副总经理唐珂正式...
微银订购APP、祥龙订购APP...   当前网络上许多所谓的“现货交易”,实质上属于变相期货交易。所谓“变相期货”,是指在未获得国家相关...
2025年全国演出票房收入61... 近日,中国演出行业协会发布2025年全国演出市场简报。据中国演出行业协会票务信息采集平台监测和调研测...
汾酒成功融入年轻消费圈层 为白... 当Z世代逐渐成为消费主力,“年轻化”不再是酒企的附加题,而是生存与增长的必答题。作为拥有6000年酿...
上海生生由52岁董事长鞠继兵持... 瑞财经 严明会 1月13日,上海生生医药冷链科技股份有限公司(以下简称:上海生生)向港交所主板递交上...
“蹒跚”钱大妈:战胜了中国大妈... 斑马消费 沈庹 创立早期一路狂奔的钱大妈,似乎已经跑不动了。 2023年以来,旗下门店数量和收入几无...
美国OTC市场动态:2025年... 2025年11月,美国OTC市场运营数据显示,其整体呈现“规模扩大、发展加速、交易活跃、转板通畅”的...
科创AI指数半日涨超5%,科创... 截至午间收盘,上证科创板人工智能指数上涨5.2%,中证人工智能主题指数上涨3%。Wind数据显示,科...
要琢磨90%的人为啥亏钱,然后... 来源:洪言微语 今日行情 1月13日,A股市场呈现剧烈分化,上证指数下跌0.64%,终结了史无前例的...
茅台重夺价格主导权:时隔八年,... 21世纪经济报道记者肖夏 2025年末的茅台酒经销商联谊会上,当茅台管理层提出茅台酒的产品价格要“随...
原创 特... 我们就完蛋了!这一句话出自特朗普口中,原因正是美国法院即将对关税政策做出裁决。然而,正是在这番充满混...