【LeetCode】337. 打家劫舍 III

在这里插入图片描述

思路是:递归解题,rob(根节点)可以分成两种情况:一定有根节点,一定没有根节点。其中,一定有根节点的情况,说明一定没有根节点的两个儿子。
这个方法是自上而下的,因而有许多重复的子问题。时间复杂度较高。

在这里插入图片描述

public class Solution {
    public int rob(TreeNode root) {
        // 用递归的思路
        if (root == null) return 0;
        int money = root.val;
        if (root.left != null) {
            money += rob(root.left.left) + rob(root.left.right);
        }
        if (root.right != null) {
            money += rob(root.right.left) + rob(root.right.right);
        }
        return Math.max(money, rob(root.right) + rob(root.left));
    }
}

用从下至上的方法解这道动态规划的题目。
可以看见时间的提升是926倍。

在这里插入图片描述

public class Solution {
    public int rob(TreeNode root) {
        // 应该由下至上,动态规划解题
        return method(root).val;
    }

    public TreeNode method(TreeNode node) {
        if (node == null){
            TreeNode tmp = new TreeNode(0);
            tmp.left = new TreeNode(0);
            tmp.right = new TreeNode(0);
            return tmp;
        }
        // node不为空
        node.left = method(node.left);
        node.right = method(node.right);
        // 分成两种情况:1,node被偷。2,node不被偷。
        node.val = Math.max(node.val +
                        node.left.left.val + node.left.right.val + node.right.left.val + node.right.right.val,
                node.left.val + node.right.val);
        return node;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值