目录
[Leecode 198.打家劫舍](#Leecode 198.打家劫舍)
[Leecode 213.打家劫舍 II](#Leecode 213.打家劫舍 II)
[Leecode 337.打家劫舍III](#Leecode 337.打家劫舍III)
Leecode 198.打家劫舍
题目地址:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目类型:打家劫舍
cpp
class Solution {
public:
int rob(vector<int>& nums) {
int n = nums.size();
if (n == 1) return nums[0];
if (n == 2) return max(nums[0], nums[1]);
// dp[i]代表前i家所能打劫到的最大数目
vector<int> dp(n, 0);
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);
// dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])
for (int i = 2; i < n; ++i) {
dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);
}
return dp[n - 1];
}
};
Leecode 213.打家劫舍 II
题目地址:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目类型:打家劫舍
思路:与普通打家劫舍的区别是,首尾不能同时取,所以
cpp
class Solution {
private:
int rob1(vector<int>& nums) {
int n = nums.size();
if (n == 1) return nums[0];
if (n == 2) return max(nums[0], nums[1]);
// dp[i]代表前i家所能打劫到的最大数目
vector<int> dp(n, 0);
dp[0] = nums[0];
dp[1] = max(nums[0], nums[1]);
// dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])
for (int i = 2; i < n; ++i) {
dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]);
}
return dp[n - 1];
}
public:
int rob(vector<int>& nums) {
if (nums.size() == 1) return nums[0];
vector nums1(nums.begin(), nums.end() - 1);
vector nums2(nums.begin() + 1, nums.end());
return max(rob1(nums1), rob1(nums2));
}
};
Leecode 337.打家劫舍III
题目地址:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题目类型:打家劫舍
cpp
class Solution {
private:
// 返回的数组即为dp数组,一共连个元素:[偷当前节点获得的最大收益,不偷当前节点获得的最大收益]
vector<int> robTree(TreeNode* root) {
if (!root) return {0, 0};
vector nums1 = robTree(root->left);
vector nums2 = robTree(root->right);
// 不取当前节点
int val1 = max(nums1[0], nums1[1]) + max(nums2[0], nums2[1]);
// 取当前节点
int val2 = root->val + nums1[0] + nums2[0];
return {val1, val2};
}
public:
int rob(TreeNode* root) {
vector<int> nums = robTree(root);
return max(nums[0], nums[1]);
}
};