本文最后更新于598 天前,其中的信息可能已经过时,如有错误请发送邮件到tomding1065@gmail.com
视频讲解:https://www.bilibili.com/video/BV1oM411B7xq
https://programmercarl.com/0213.%E6%89%93%E5%AE%B6%E5%8A%AB%E8%88%8DII.html
1.本题我原来的思路,编写一个判断是否使用第一个元素的函数,这样就是正常遍历整个数组然后来判断是否使用第一个元素然后根据最后一个元素的数值来判断是否能够使用第一个元素。视频给出的思路是将本题的关键点,环拆成线性的方式进行处理,也就是分成三个方法来将其转化为线性的做法,(1)除去首尾元素其他进行原来的操作。(2)除去第一个元素其他的进行原来的操作。(3)除去最后一个元素前面的所有元素进行原来的操作。tips:前两个打家劫舍问题的dp数组的含义的是考虑第i个元素之前的数据所能偷到的最大的dp[i]的数值。
CPP
class Solution {
public:
int robRange(vector<int> &nums, int start, int end){
if(start == end) return nums[start];
vector<int> dp(end + 1, 0);
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];
}
int rob(vector<int>& nums) {
if(nums.size() == 0)return 0;
if(nums.size() == 1)return nums[0];
int res1 = robRange(nums, 0, nums.size() - 2);
int res2 = robRange(nums, 1, nums.size() - 1);
return max(res1, res2);
}
};