代码随想录算法训练营第四十四天|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];
    }
};
相关推荐
apcipot_rain1 小时前
C++转Java日记(02)
java·开发语言·c++
杜 硕2 小时前
从零开始的C++生活——第七讲——02
开发语言·c++·生活
Rabitebla10 小时前
【Linux 底层原理】进程(十):进程等待详解---从僵尸进程到 wait、waitpid 与 status
linux·c++·笔记·学习·visual studio
西西弗Sisyphus12 小时前
C++ 超时互斥锁(Timed Mutex):std::timed_mutex 与 std::unique_lock
c++
其实防守也摸鱼14 小时前
个人学习 Pwn 思路:从基础到漏洞利用的进阶路径
大数据·前端·人工智能·chrome·算法·安全·网络安全
今天要早睡_14 小时前
C++01_入门基础复习
开发语言·c++
Nuanyt14 小时前
LeetCode Hot 100 链表专题(五)· 2 题(Java)
java·算法·leetcode·链表
Fuyo_111917 小时前
C++ 运行时多态与虚函数机制全面剖析【面试重点】
开发语言·c++·面试
w_zero_one17 小时前
递归算法(一)
java·开发语言·算法