代码随想录算法训练营第四十四天|LeetCode198 打家劫舍、LeetCode213 打家劫舍Ⅱ

题1:

指路:198. 打家劫舍 - 力扣(LeetCode)
思路与代码:

对于这个题,拿房屋i举例,我们需要考虑的是否确定偷取这个房屋 ,如果确定偷取 这个房屋,那么我们将得到房屋i的金币也就是numsi ,但是因为不能偷取相邻的房屋,那么得到numsi和前i-2个房屋最大金币数的同时失去的是numsi-1 ,否则不偷取这个房屋,那么考虑偷取的就是第i-1个房屋 。这里我们就需要判断这两种情况那种得到的金币最多 。特殊情况,当房屋门下标是0 时,此时一定会偷取这仅有的一间,那么此时金币数为nums0 ,当房屋下标为1 时,我们需要判断第0间房屋和第1间房屋的较大值 ,得到较大的金币数。首先,定义一个数组dpi,其含义为考虑下标为i在内(包括i)的房屋之前能够偷得的最大的金币数 ;其次我们尝试得出递推公式,前面分析题意阶段已经有提到过dpi应该取确定偷取第i间房屋和确定不偷取第i间房屋的较大值,也就是dpi=max(numsi + dpi - 2, dpi - 1) ;然后对dp数组进行初始化,我们在前面也提到过,即dp0=nums0,dp1=max(nums0, nums1) ;接着我们确定遍历顺序,这个题的遍历顺序显而易见,从小到大即可,也就是从下标为2到nums.size();最后打印dp数组即可。代码如下:

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

题2:

指路:213. 打家劫舍 II - 力扣(LeetCode)
思路与代码:

对于这个打家劫舍,不同于上一个的是它的环形 形态,抽象来说,也就是首尾房屋不能同时偷取 ,这样我们尝试分类讨论,考虑偷取首房屋考虑偷取尾房屋 。那么,中间不带首尾房屋的情况就是我们上一题的打家劫舍 。在public中讨论考虑两种偷取方式的结果取较大值即可。代码如下:

cpp 复制代码
class Solution {
public:
    int rob(vector<int>& nums) {
    if (nums.size() == 0) return 0;
    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);
    }
    int robRange(vector<int>& nums, int start, int end) {
        if (end == start) return nums[start];
        vector<int> dp(nums.size());
        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 - 2] + nums[i], dp[i - 1]);
        }
        return dp[end];
    }
};
相关推荐
shehuiyuelaiyuehao2 小时前
算法31,前缀和,可被k整除的子数组
数据结构·python·算法
203号居民4 小时前
LeetCode hot 100 — 141. 环形链表2
算法·leetcode·链表
玖玥拾4 小时前
LeetCode 202 快乐数
算法·leetcode
LuminousCPP4 小时前
数据结构-二叉树(六):BFS层序遍历与完全二叉树判断|复用链式队列 + (N_0=N_2+1) 性质证明
c语言·数据结构·笔记·算法·二叉树·宽度优先
ZhouDevin5 小时前
算法论文/数据集3——CLD(TMLR2025)压缩训练集,仅保留对验证集有益的样本
人工智能·深度学习·算法·计算机视觉
码匠许师傅5 小时前
【设计模式精讲】14.外观模式(Facade)
c++·设计模式·uml·外观模式
Tim_105 小时前
【LeetCode】29、两数相除
算法·leetcode·职场和发展
纪念 2295 小时前
数据结构排序(三)
数据结构
船厂电气自动化ai大模型6 小时前
AI大模型与数学/第63课:矩阵定义、矩阵加法、标量乘法(逐级精讲)
数据结构·人工智能·深度学习·线性代数·算法
余额瞒着我当琳6 小时前
算法修炼 chapter 2 双指针进阶、盛最多水的容器、有效三角形的个数、两数之和、三数之和、四数之和
算法