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

题1:

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

对于这个题,拿房屋i举例,我们需要考虑的是否确定偷取这个房屋 ,如果确定偷取 这个房屋,那么我们将得到房屋i的金币也就是nums[i] ,但是因为不能偷取相邻的房屋,那么得到nums[i]和前i-2个房屋最大金币数的同时失去的是nums[i-1] ,否则不偷取这个房屋,那么考虑偷取的就是第i-1个房屋 。这里我们就需要判断这两种情况那种得到的金币最多 。特殊情况,当房屋门下标是0 时,此时一定会偷取这仅有的一间,那么此时金币数为nums[0] ,当房屋下标为1 时,我们需要判断第0间房屋和第1间房屋的较大值 ,得到较大的金币数。首先,定义一个数组dp[i],其含义为考虑下标为i在内(包括i)的房屋之前能够偷得的最大的金币数 ;其次我们尝试得出递推公式,前面分析题意阶段已经有提到过dp[i]应该取确定偷取第i间房屋和确定不偷取第i间房屋的较大值,也就是dp[i]=max(nums[i] + dp[i - 2], dp[i - 1]) ;然后对dp数组进行初始化,我们在前面也提到过,即dp[0]=nums[0],dp[1]=max(nums[0], nums[1]) ;接着我们确定遍历顺序,这个题的遍历顺序显而易见,从小到大即可,也就是从下标为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];
    }
};
相关推荐
沐雪轻挽萤3 分钟前
17. C++17新特性-并行算法 (Parallel Algorithms)
java·开发语言·c++
A7bert77710 分钟前
【YOLOv8部署至RDK X5】模型训练→转换bin→Sunrise 5部署
c++·人工智能·python·深度学习·yolo·机器学习
扶苏xw16 分钟前
【分组背包】
算法·动态规划
李兆龙的博客21 分钟前
从一到无穷大 #68 Agent Memory 全景:大模型智能体记忆机制的形态、动态与前沿
大数据·人工智能·算法
cwplh44 分钟前
平衡树学习笔记
数据结构·笔记·学习·算法
wen__xvn1 小时前
天梯赛L2刷题(也就写写水题骗骗自己了)
算法
EllinY1 小时前
扩展欧几里得算法 exgcd 详解
c++·笔记·数学·算法·exgcd
量子炒饭大师1 小时前
【C++11】RAII 义体加装指南 ——【包装器 与 异常】C++11中什么是包装器?有哪些包装器?C++常见异常有哪些?(附带完整代码讲解)
开发语言·c++·c++11·异常·包装器
AI科技星1 小时前
三维网格—素数对偶性及其严格证明(全域数学·统一基态演化版)
算法·数学建模·数据挖掘
炘爚1 小时前
深入解析内存分区:程序运行的秘密
c++