【代码随想录】day48

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一、198打家劫舍

class Solution {
public:
    int rob(vector<int>& nums) {
        vector<int> dp(nums.size() + 2, 0);
        for (int i = 0; i < nums.size(); i ++) {
            dp[i+2] = max(dp[i+1], dp[i] + nums[i]);
        }
        return dp[nums.size()+1];
    }
};

二、213打家劫舍II

class Solution {
public:
    int helper(vector<int>& nums, int start, int end) {
        vector<int> dp(2, 0);
        for (int i = start; i < end; i ++) {
            dp.push_back(max(dp.back(), dp[dp.size()-2] + nums[i]));
        }
        return dp.back();
    }

    int rob(vector<int>& nums) {
        if (nums.size() == 1) {
            return nums.back();
        }
        int res1 = helper(nums, 0, nums.size() - 1);
        int res2 = helper(nums, 1, nums.size());
        return max(res1, res2);
    }
};

三、337打家劫舍III

class Solution {
public:
    unordered_map<TreeNode*, int> umap;
    int rob(TreeNode* root) {
        if (root == nullptr) {
            return 0;
        }
        if (root->left == nullptr && root->right == nullptr) {
            return root->val;
        }
        if (umap[root]) {
            return umap[root];
        }
        int val1 = root->val;
        if (root->left) {
            val1 += rob(root->left->left) + rob(root->left->right);
        }
        if (root->right) {
            val1 += rob(root->right->left) + rob(root->right->right);
        }
        int val2 = rob(root->left) + rob(root->right);
        umap[root] = max(val1, val2);
        return max(val1, val2);        
    }
};

优化版:

class Solution {
public:
    vector<int> robTree(TreeNode* cur) {
        if (cur == nullptr) {
            return vector<int>(2, 0);
        }
        vector<int> left = robTree(cur->left);
        vector<int> right = robTree(cur->right);
        //偷当前节点,左右孩子不能偷
        int val1 = cur->val + left[1] + right[1];
        //不偷当前节点,左右孩子可以偷
        int val2 = max(left[0], left[1]) + max(right[0], right[1]);
        return {val1, val2};
    }
    
    int rob(TreeNode* root) {
        vector<int> dp = robTree(root);
        return max(dp[0], dp[1]);
    }
};

相关推荐

  1. 代码随想day48

    2024-05-05 00:20:01       12 阅读
  2. 代码随想Day42

    2024-05-05 00:20:01       14 阅读
  3. 代码随想Day45

    2024-05-05 00:20:01       13 阅读
  4. 代码随想day41

    2024-05-05 00:20:01       16 阅读
  5. 代码随想day44

    2024-05-05 00:20:01       45 阅读
  6. 代码随想day45

    2024-05-05 00:20:01       10 阅读
  7. 代码随想day49

    2024-05-05 00:20:01       15 阅读
  8. 代码随想三刷day44

    2024-05-05 00:20:01       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-05-05 00:20:01       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-05-05 00:20:01       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-05-05 00:20:01       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-05-05 00:20:01       20 阅读

热门阅读

  1. 代码随想录leetcode200题之数组

    2024-05-05 00:20:01       14 阅读
  2. 品味酱香酒与浓香酒,选择最适合您的白酒

    2024-05-05 00:20:01       10 阅读
  3. 每日一练算法

    2024-05-05 00:20:01       10 阅读
  4. 绕过Windows 11的安装门槛

    2024-05-05 00:20:01       9 阅读
  5. Ubuntu22安装docker

    2024-05-05 00:20:01       11 阅读
  6. Json高效处理方法

    2024-05-05 00:20:01       9 阅读
  7. Visual Studio 2022 工具 选项 没有网络设置问题解决

    2024-05-05 00:20:01       11 阅读
  8. Docker

    Docker

    2024-05-05 00:20:01      10 阅读
  9. 小爱同学+Home Assistant实现开关电脑

    2024-05-05 00:20:01       26 阅读
  10. OSTEP Projects:Unix Utilities

    2024-05-05 00:20:01       11 阅读