zoukankan      html  css  js  c++  java
  • 124. Binary Tree Maximum Path Sum

    一刷。。

    这个题虽然标记是H,但是写起来不难,不过中间逻辑一开始做得很乱。总体感觉不如刚二刷的333难。。

    题里给定义的Path是左-中-右这种连线,有点含糊,其实是说白了就是随便画一条没有分叉的线。。

    还是通过Post-Order traversal来bottom-up解决问题。

    我们要传上去的信息有:

    1. 我这里的max path 。
    2. 没了。

    首先很明显,如果一条线传上去的是负数,那我们宁可不要。 所以左边右边传上来的值要先和0比较。(我一开始没比较,后面才比较很麻烦,所以不如先比较)
    eg: leftRes = max(postOrder(root.left),0);

    当我有了左右两边的结果,我传上去的结果就有这么几种情况:
    1)左右都大于0,那么选择较大的+自己。
    2)左右都小于0,那直接选我自己。
    3)左右我自己都小于0,无所谓,传上去之后会和0比较,所以这里可以先不管。

    然后还要更新一个最大值,最大值有这么几种情况:

    1. 现有max
    2. 自己+左边
    3. 自己+右边
    4. 自己+左边+右边

    用max(max, root.val + leftRes + rightRes)
    表示是因为我们leftRes, rightRes都和0比较过,比如右边 < 0,我们选择自己 + 左边,此时右边是0,所以可以直接加。

    这就是我一开始说的这里判断比较方便,我第一次没和0比较,分别讨论哪边大,是0怎么办之类的很麻烦。。

    Time: O(n)
    Space: O(n) memory stack

    public class Solution {
        int res = Integer.MIN_VALUE;
        public int maxPathSum(TreeNode root) {
            dfs(root);
            return res;
        }
        
        public int dfs(TreeNode root) {
            if (root == null) return 0;
            
            int leftRes = Math.max(dfs(root.left), 0);
            int rightRes = Math.max(dfs(root.right), 0);
            
            res = Math.max(res, root.val + leftRes + rightRes);
            
            return Math.max(root.val + leftRes, root.val + rightRes);
        }
    }
    
  • 相关阅读:
    饱和色
    Server.MapPath()相关
    Oracle修改表结构
    远程关机
    使用sqlplus创建表空间
    自写Js+CSS轮显效果
    右下角随机显示的CSS+JS图片广告
    JavaScript实现鼠标放上动画加载大图的代码
    CSS实现自适应的图片背景边框代码
    JavaScript弹性透明的图片放大代码
  • 原文地址:https://www.cnblogs.com/reboot329/p/6105894.html
Copyright © 2011-2022 走看看