题目:198.打家劫舍
文章链接:代码随想录
视频链接:LeetCode:198.打家劫舍
题目链接:力扣题目链接
图释:
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.size()==0) return 0;
if(nums.size()==1) return nums[0];
//dp[]数组表示,偷到第i个房间(包含),偷窃到的最高金额
vector<int>dp(nums.size(), 0);
dp[0]= nums[0]; // 表示偷1号房间,下标为0
dp[1] = max(nums[0], nums[1]);
for(int i=2; i<nums.size(); i++){
// 递推公式 第i个房间跟 i-1和i-2个房间相关,
// 偷:dp[i-2]+nums[i] 不偷:dp[i-1]
dp[i] = max(dp[i-1], dp[i-2]+nums[i]);
}
return dp[nums.size()-1];
}
};
题目:213.打家劫舍II
文章链接:代码随想录
视频链接:LeetCode:213.打家劫舍||
题目链接:力扣题目链接
图释:
class Solution {
public:
int rob(vector<int>& nums) { // [1,2,3,1]
if(nums.size() == 0) return 0;
if(nums.size() == 1) return nums[0];
int result1 = robRange(nums, 0, nums.size()-2); // [1,2,3]
int result2 = robRange(nums, 1, nums.size()-1); // [2,3,1]
return max(result1, result2);
}
// 198.打家劫舍
int robRange(vector<int>& nums, int start, int end){
if(start==end) return nums[start]; // 数组为两个的时候nums=[3,2] 情况一返回3,情况二返回2
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];
}
};
题目:337.打家劫舍III
文章链接:代码随想录
视频链接:LeetCode:337.打家劫舍|||
题目链接:力扣题目链接
图释:
class Solution {
public:
vector<int> robTree(TreeNode* cur){ // 计算当前节点偷还是不偷,返回的是dp[]数组
// 初始化:访问到根节点
if(cur == NULL) return {0,0}; // 不管是偷还是不偷,金额数都为0
// 下标0:不偷,下标1:偷 左右孩子
vector<int>leftdp = robTree(cur->left); // 左
vector<int>rightdp = robTree(cur->right); // 右
// 中
// 偷当前节点,则左右孩子不偷
int val1 = cur->val + leftdp[0]+ rightdp[0];
// 不偷当前节点,则考虑偷左右孩子
int val2 = max(leftdp[1],leftdp[0]) + max(rightdp[1],rightdp[0]);
return {val2, val1};
}
int rob(TreeNode* root) {
vector<int> result = robTree(root);
return max(result[0], result[1]);
}
};