打家劫舍
力扣题目链接
class Solution {
public:
int rob(vector<int>& nums) {
if(nums.size() == 1) return nums[0];
if(nums.size() == 2) return max(nums[1], nums[0]);
int n = nums.size();
vector<int> dp(n, 0);
dp[0] = nums[0];
dp[1] = max(nums[1], nums[0]);
for(int i = 2; i < nums.size(); i++){
dp[i] = max(dp[i-1], dp[i-2] + nums[i]);
}
return dp[n-1];
}
};
打家劫舍II
力扣题目链接
class Solution {
public:
int rob(vector<int>& nums) {
int n = nums.size();
if(n == 1)
return nums[0];
if(n == 1)
return max(nums[0], nums[1]);
return max(rotRange(nums,0,n-2), rotRange(nums, 1, n-1));
}
int rotRange(vector<int>& nums, int startIndex, int endIndex){
vector<vector<int>> dp(endIndex+1, vector<int>(2, 0));
dp[startIndex][0] = nums[startIndex];
for(int i = startIndex+1; i <= endIndex; i++){
dp[i][0] = dp[i-1][1] + nums[i];
dp[i][1] = max(dp[i-1][1], dp[i-1][0]);
}
return max(dp[endIndex][0], dp[endIndex][1]);
}
};
打家劫舍 III
力扣题目链接
class Solution {
public:
int rob(TreeNode* root) {
vector<int> result = robNode(root);
return max(result[0], result[1]);
}
vector<int> robNode(TreeNode* root){
if(!root)
return {0,0};
vector<int> l = robNode(root->left);
vector<int> r = robNode(root->right);
return {root->val + l[1] + r[1], max(l[0], l[1])+ max(r[0], r[1])};
}
};