代码随想录算法训练营第四十四天|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];
    }
};
相关推荐
不会写DN14 分钟前
为什么map查找时间复杂度是O(1)?
算法·哈希算法·散列表
iiiiyu17 分钟前
常用API(StringJoiner类 & Math类 & System类)
java·大数据·开发语言·数据结构·编程语言
始三角龙17 分钟前
LeetCode hoot 100 -- 找到字符串中的所有字母异位词
算法·leetcode·职场和发展
abant222 分钟前
leetcode 45 跳跃问题2 很难的贪心
算法·leetcode·职场和发展
小糯米60123 分钟前
C语言指针3
c语言·数据结构·算法
ZPC821028 分钟前
ROS2 通信提速快过UDP
人工智能·算法·机器人
RD_daoyi30 分钟前
谷歌2026年 3 月核心更新深度解析:SEO 从内容优化到信息供给系统的全面重构
人工智能·算法·重构
Xiu Yan38 分钟前
Java 转 C++ 系列:函数对象、谓词和内建函数对象
java·开发语言·c++
lkforce42 分钟前
MiniMind学习笔记(零)--基础概念
人工智能·算法·机器学习·token·分词器·minimind·词汇表
6Hzlia43 分钟前
【Hot 100 刷题计划】 LeetCode 94. 二叉树的中序遍历 | C++ 递归法 & 迭代法
算法