代码随想录算法训练营Day47 | 198.打家劫舍 213.打家劫舍II 337.打家劫舍III

发布于:2024-05-24 ⋅ 阅读:(92) ⋅ 点赞:(0)

代码随想录算法训练营Day47 | 198.打家劫舍 213.打家劫舍II 337.打家劫舍III

LeetCode 198.打家劫舍

题目链接:LeetCode 198.打家劫舍

思路:
当前打劫或者不打劫

class Solution {
public:
    int rob(vector<int>& nums) {
        vector<int> dp(nums.size());
        if(nums.size()==1) return nums[0];
        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];
    }
};

注意 :

  1. 从2开始遍历。

LeetCode 213.打家劫舍II

题目链接:LeetCode 213.打家劫舍II

思路:
包含首元素和包含尾元素,综合即可。 因为无法同时包含首位。

class Solution {
public:
    int robRange(vector<int>& nums, int start, int end){
        if(start == end) 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];
    }

    int rob(vector<int>& nums) {
        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);
    }
};

注意 :

LeetCode 337.打家劫舍III(待补充)

题目链接:LeetCode 337.打家劫舍III

思路:

class Solution {
public:
    int rob(TreeNode* root) {
        vector<int> result = robTree(root);
        return max(result[0], result[1]);
    }
    // 长度为2的数组,0:不偷,1:偷
    vector<int> robTree(TreeNode* cur) {
        if (cur == NULL) return vector<int>{0, 0};
        vector<int> left = robTree(cur->left);
        vector<int> right = robTree(cur->right);
        // 偷cur,那么就不能偷左右节点。
        int val1 = cur->val + left[0] + right[0];
        // 不偷cur,那么可以偷也可以不偷左右节点,则取较大的情况
        int val2 = max(left[0], left[1]) + max(right[0], right[1]);
        return {val2, val1};
    }
};

注意 :
1.
2.
3.
4.

LeetCode 704 二分查找

题目链接:LeetCode 704 二分查找

思路:


注意 :
1.
2.
3.
4.


网站公告

今日签到

点亮在社区的每一天
去签到