代码随想录算法训练营第四十八天|198.打家劫舍、213.打家劫舍II、337.打家劫舍III
创始人
2025-06-01 00:01:43
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和树结合的一道题

今日总结:

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

相关内容

热门资讯

安卓系统苹果手机识别,跨界融合... 你知道吗?在科技飞速发展的今天,手机已经成为了我们生活中不可或缺的一部分。而说到手机,安卓系统和苹果...
harmonyos系统是不是安... 亲爱的读者,你是否曾好奇过HarmonyOS系统与安卓系统之间的关系?是不是安卓的“亲戚”?今天,就...
手机怎么装系统安卓,安卓系统安... 手机卡顿了?想给安卓系统来个大变身?别急,跟着我一步步来,保证让你的手机焕然一新!一、准备工作在开始...
安卓Linux系统内网穿透,A... 你有没有想过,你的安卓手机里那些看似普通的APP,其实可能正在悄悄地帮你打通网络世界的任督二脉呢?没...
win怎么安装安卓系统,Win... 亲爱的读者,你是不是对Win系统上的安卓应用垂涎已久,但又苦于不知道如何安装安卓系统呢?别急,今天我...
升级小米平板安卓系统,畅享全新... 你有没有发现,你的小米平板用久了,是不是感觉有点卡呢?别急,今天就来教你怎么给它来个系统升级,让它焕...
捷豹安卓系统车载,捷豹安卓系统... 哇,你有没有想过,当你的手机和汽车融为一体,会是怎样的体验呢?想象你正驾驶着你的捷豹,车窗外的风景如...
安卓1到10系统,安卓1.0至... 你有没有想过,手机里的安卓系统就像是我们生活中的好朋友,从青涩的少年成长为稳重的青年呢?从安卓1.0...
安卓8.0停用系统应用,提升使... 你知道吗?最近安卓系统又来了一次大动作,那就是安卓8.0系统开始停用一些系统应用了。这可真是让人有点...
安卓系统修改mtu值,轻松提升... 你有没有想过,你的安卓手机其实是个小小的电脑呢?它里面藏着许多可以自定义的秘密功能,就像修改MTU值...
安卓平板改window系统,探... 你有没有想过,你的安卓平板其实可以摇身一变,变成一个Windows系统的电脑呢?没错,就是那种可以运...
时空猎人安卓苹果系统,探索无尽... 你知道吗?最近在手机游戏圈里,有一款叫做《时空猎人》的游戏可是火得一塌糊涂呢!不管是安卓用户还是苹果...
安卓9.0系统的电视,新一代电... 亲爱的读者们,你是否也像我一样,对科技新玩意儿充满好奇?今天,我要和你聊聊一个让人眼前一亮的话题——...
小pc安装安卓系统,轻松安装安... 你有没有想过,你的小PC也能变身成为安卓系统的超级玩家呢?没错,就是那个平时默默无闻的小家伙,现在也...
高通备份安卓系统,全方位数据安... 你知道吗?在这个科技飞速发展的时代,手机备份可是个不得不提的话题。尤其是对于安卓用户来说,选择一个靠...
谷歌安卓系统有多少,从诞生到全... 你有没有想过,那个无处不在的谷歌安卓系统,究竟在全球有多少用户呢?它就像一个神秘的数字,每天都在悄悄...
fc黄金传说安卓系统,畅享复古... 你有没有听说最近安卓系统上的一款超酷的游戏——《FC黄金传说》?这款游戏可是让不少玩家都沉迷其中,今...
变小的我安卓系统,安卓系统演变... 你有没有发现,最近你的手机好像变轻了?没错,说的就是你,那个陪伴你多年的安卓系统。它悄无声息地进行了...
vivo安卓系统小彩蛋,体验科... 你知道吗?在vivo的安卓系统中,竟然隐藏着一些超有趣的小彩蛋!这些小彩蛋就像是在手机里埋下的宝藏,...
安卓系统如何强制重启,安卓系统... 手机突然卡壳了,是不是又该给它来个“大保健”了?没错,今天就来聊聊安卓系统如何强制重启。别小看这个看...