LeetCode刷题笔记——T0337 打家劫舍Ⅲ

题目描述:

alt

alt

题目思路:

本题属于动态规划题目,即遍历二叉树,获得偷窃最大值。二叉树的遍历可以分为:深度优先遍历,前序/中序/后序遍历;广度优先遍历,层序遍历。本体需要使用后序遍历方式,当前结点投不投在乎与,其左右孩子所掌握的金额值不值得偷当前结点。题目中使用得dp数组大小为2,dp[0]表示当前结点不偷时,返回得最大金额,dp[1]表示当前结点被偷时,返回的最大金额。根据左右孩子是否被偷,再来查看当前结点偷与不偷。

代码如下:

    struct TreeNode {
        TreeNode* left;
        TreeNode* right;
        int val;

        TreeNode(int v = 0, TreeNode* l = nullptr, TreeNode* r = nullptr) :val(v), left(l), right(r) {}
    };

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

提交结果:

alt

本题题解思路来源于:代码随想录

全部评论

相关推荐

05-01 22:41
中南大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务