LeetCode-337:打家劫舍 III

一、题目描述

在这里插入图片描述

二、解题思路

  • 错误思路:刚开始我以为只要隔层相加取最大就行了,但是不是这么回事,因为[1, 2, null, 2, 5]应该返回1 + 5 = 6,隔层只相加一部分是完全有可能的
  • 正确思路
    -
    • 假设从root节点开始
    • 如果抢劫了root节点,那么一定不可能抢劫root->leftroot->right,只能是抢劫完root之后继续抢劫root->leftroot->right的子树,得到一个值sum。而不是root->leftroot->right。之后用这个sum加上root->val,才是root节点作为入口的解,设这个解为res1
    • 反之,如果不抢劫,那就把root->leftroot->right作为两个入口,抢劫root->left之后抢劫root->right,得到这种情况下的解,设这个解为res2
    • 于是,两种情况可以写成一个递归函数
    • 需要返回时,返回两个解中较大的那个

三、解题代码

class Solution {
    unordered_map<TreeNode*, int> sums;
public:
    int rob(TreeNode* root) {
        if(!root)   return 0;
        if(sums.count(root))    return sums[root];
        int res1 = 0;
        if(root->left)
            res1 += (rob(root->left->left) + rob(root->left->right));
            
        if(root->right)
            res1 += (rob(root->right->left) + rob(root->right->right));
        res1 += root->val;
        int res2 = rob(root->left) + rob(root->right);
        sums[root] = max(res1, res2);
        return sums[root];
    }
};

四、运行结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44587168/article/details/105655993