• 代码随想录算法训练营第45天 [ 198.打家劫舍 213.打家劫舍II 337.打家劫舍III ]


    代码随想录算法训练营第45天 [ 198.打家劫舍 213.打家劫舍II 337.打家劫舍III ]


    一、198.打家劫舍

    链接: 代码随想录.
    思路: dp[i]表示偷第i间房能获得的最大价值为dp[i]
    dp[0] = nums[0]
    dp[1] = max(nums[0],nums[1])

    dp[i] = max(dp[i-2]+nums[i],dp[i-1])
    做题状态:看解析后做出来了

    class Solution {
    public:
        int rob(vector<int>& nums) {
            // dp[i]表示偷第i间房能获得的最大价值为dp[i]
            // dp[0] = nums[0]
            // dp[1] = max(nums[0],nums[1])
            // dp[i] = max(dp[i-2]+nums[i],dp[i-1])
            if (nums.size() == 1) {
                return nums[0];
            }
            vector<int> dp(nums.size() + 1, 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]);
            }
            for (int i : dp) {
                cout << i << " ";
            }
            return dp[nums.size() - 1];
        }
    };
    
    

    二、213.打家劫舍II

    链接: 代码随想录.
    思路:要么第一家和最后一家都不偷,要不只偷第一家,要不只偷第二家(后面两种情况的答案包含了第一种情况)
    做题状态:看解析后做出来了

    ;
    class Solution {
    public:
        int rob(vector<int>& nums) {
            if (nums.size() == 1) {
                return nums[0];
            }
            if (nums.size() == 2) {
                return max(nums[0], nums[1]);
            }
            // 取前面,不取后面
            int result1 = get_dp_result(0, nums.size() - 2, nums);
            // 取后面,不取前面
            int result2 = get_dp_result(1, nums.size() - 1, nums);
    
            return max(result1, result2);
        }
    
        int get_dp_result(int start, int end, vector<int>& nums) {
            vector<int> dp(nums.size(), 0);
            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]);
            }
    
            for (int i : dp) {
                cout << i << " ";
            }
    
            return dp[end];
        }
    };
    
    

    三、337.打家劫舍III

    链接: 代码随想录.
    思路:递归的时候返回本层的dp数组
    dp[当前节点不偷能获得的最大价值,当前节点偷能获取的最大价值]
    做题状态:看解析后做出来了

    
    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
     *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
     *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left),
     * right(right) {}
     * };
     */
    class Solution {
    public:
        int rob(TreeNode* root) {
            vector<int> dp = robTree(root);
            return max(dp[0], dp[1]);
        }
    
        vector<int> robTree(TreeNode* node) {
            if (node == nullptr) {
                return {0, 0};
            }
            vector<int> left_dp = robTree(node->left);
            vector<int> right_dp = robTree(node->right);
    
            // 当前节点不偷,那就是得到左右节点的最大值
            int value1 = max(left_dp[0], left_dp[1]) + max(right_dp[0], right_dp[1]);
            // 当前节点偷,那就是当前节点+左右节点不偷的值
            int value2 = node->val + left_dp[0] + right_dp[0];
            // dp数组的含义[当前节点不偷能获得的最大价值,当前节点偷能获取的最大价值]
            // 必须是后序遍历,才能返回给上一层
            return {value1, value2};
        }
    };
    
    
  • 相关阅读:
    PyQt5快速开发与实战 7.1 信号与槽介绍
    自动挂载管理
    Qt-快速展开/折叠所有代码段
    Linux下top命令详解
    gitlab修改项目名称
    Mybatis注解开发---增删改查
    第三章 内存管理 六、基本地址变换结构
    Git(10)——Git多人协同开发之邀请成员
    GCC 指令详解及动态库、静态库的使用
    LeetCode每日一题(1862. Sum of Floored Pairs)
  • 原文地址:https://blog.csdn.net/weixin_45612015/article/details/139872767