代码随想录算法训练营第四十四天|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];
    }
};
相关推荐
Ajiang28247353046 分钟前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++
盼海11 分钟前
排序算法(五)--归并排序
数据结构·算法·排序算法
网易独家音乐人Mike Zhou4 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
‘’林花谢了春红‘’5 小时前
C++ list (链表)容器
c++·链表·list
搬砖的小码农_Sky6 小时前
C语言:数组
c语言·数据结构
机器视觉知识推荐、就业指导6 小时前
C++设计模式:建造者模式(Builder) 房屋建造案例
c++
Swift社区7 小时前
LeetCode - #139 单词拆分
算法·leetcode·职场和发展
Kent_J_Truman8 小时前
greater<>() 、less<>()及运算符 < 重载在排序和堆中的使用
算法
先鱼鲨生8 小时前
数据结构——栈、队列
数据结构