成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

力扣(LeetCode)124

geekidentity / 1477人閱讀

題目地址:
https://leetcode-cn.com/probl...
題目描述:

給定一個(gè)非空二叉樹(shù),返回其最大路徑和。

本題中,路徑被定義為一條從樹(shù)中任意節(jié)點(diǎn)出發(fā),達(dá)到任意節(jié)點(diǎn)的序列。該路徑至少包含一個(gè)節(jié)點(diǎn),且不一定經(jīng)過(guò)根節(jié)點(diǎn)。

示例 1:

輸入: [1,2,3]

       1
      / 
     2   3

輸出: 6
示例 2:

輸入: [-10,9,20,null,null,15,7]

   -10
   / 
  9  20
    /  
   15   7

輸出: 42

解答:
這一題,看上去,根本不可能做出來(lái)!為什么呢?因?yàn)檫@里的路徑和很特別,它可以是從任意點(diǎn)到任意點(diǎn)的路徑,搜索我都搜索不出來(lái),按照定義路徑可以是從一個(gè)葉子到另一個(gè)葉子,比如這樣:

   -10
   / 
  9  20
    /  
   15   7
   

15->20->7,這條路徑,怎么搜索?搜索的代碼都寫(xiě)不出來(lái)!?。?br>那么只能放棄了。。。
我認(rèn)為直接求路徑和這題是無(wú)解的,寫(xiě)不出代碼。而這一題我是求別的東西,順帶求出了答案。

但是想一下下面的幾個(gè)簡(jiǎn)單問(wèn)題,這個(gè)問(wèn)題就能做出來(lái)了!
(如果跳過(guò)這幾個(gè)簡(jiǎn)單問(wèn)題直接看答案,除非你天賦異稟,否則能看懂那你這思維也是沒(méi)誰(shuí)了)

二叉樹(shù)的深度怎么求?

int depth(TreeNode root)
{
if(root == null)return 0;
return 1+Math.max(depth(root.left),depth(root.right));
}

二叉樹(shù)的深度等于,max(左子樹(shù)的深度,右子樹(shù)的深度)+1。

假設(shè)二叉樹(shù)的val字段為int類(lèi)型。
基于求深度的思想,進(jìn)階一下求節(jié)點(diǎn)到節(jié)點(diǎn)的最大路徑和

int maxSum(TreeNode root)
{
if(root == null)return 0;
 return root.val + Math.max(maxSum(root.left),maxSum(root.right));
}

根到葉的最大路徑和等于max(左子樹(shù)根到葉最大路徑和,右子樹(shù)根到葉最大路徑和)+root.val。

現(xiàn)在求,根節(jié)點(diǎn)到某一子節(jié)點(diǎn),使得該路徑和最大,該子節(jié)點(diǎn)可以不是葉子節(jié)點(diǎn),給出最大路徑長(zhǎng)度。
how?
這個(gè)和上面那倆其實(shí)是一個(gè)原理,給這個(gè)函數(shù)起個(gè)名字叫做"根向下最大延申"
那么算法是:
int temp =max(左子樹(shù)根向下最大延申,右子樹(shù)根向下最大延申)。
若temp > 0,則根向下最大延申=root.val+temp,否則根向下最大延申=root.val
代碼為:

 int dfs(TreeNode root)
    {
        if(root == null)return 0;
        int left = dfs(root.left);
        int right = dfs(root.right);
        int temp = Math.max(left,right);
        if(temp > 0)
            temp += root.val;
        else
            temp = root.val;

        return temp;
    }

求出上面這個(gè)有什么用?。。????用處實(shí)在是太大了啊啊啊啊?。。。。。?br>求出了上面這個(gè),這個(gè)問(wèn)題就基本可解了?。?!
為什么呢?
我們這么想,給我任意一個(gè)樹(shù)的節(jié)點(diǎn)root,現(xiàn)在給這個(gè)"根向下最大延申"函數(shù)起個(gè)英文名叫做dfs。那么經(jīng)過(guò)這個(gè)節(jié)點(diǎn)的最大路徑和只可能是下面幾種情況:
1、
root.val
該節(jié)點(diǎn)本身值。
2、
dfs(root.left)+root.val,該節(jié)點(diǎn)本身值+左子樹(shù)向下最大延申。
此時(shí)dfs(root.left) > 0 && dfs(root.right) <= 0。
3、
dfs(root.right)+root.val,該節(jié)點(diǎn)本身值+右子樹(shù)向下最大延申。
此時(shí)dfs(root.left) <= 0 && dfs(root.right) > 0。
4、dfs(root.left)+dfs(root.right)+root.val
該節(jié)點(diǎn)本身值+左右子樹(shù)向下最大延申。
此時(shí)dfs(root.left) > 0 && dfs(root.right) > 0。

上面四種情況包含了經(jīng)過(guò)這個(gè)節(jié)點(diǎn)的最大路徑和的所有可能。
雖然不能求出任意點(diǎn)任意點(diǎn)的路徑和,但是已經(jīng)可以得到該題的解了!?。?br>(讀者可以想想為什么不求出任意點(diǎn)到任意點(diǎn)的路徑和也能求出答案)
因此,對(duì)于任意一個(gè)節(jié)點(diǎn)root,求出經(jīng)過(guò)該節(jié)點(diǎn)的最大路徑和,然后和全局答案
進(jìn)行比較,更新全局答案為最大值,就能夠求出這一題的答案?。?!

java ac代碼:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int maxPathSum(TreeNode root) {
        
        if(root == null)return 0;
        dfs(root);
        return ans;
        
    }
    int ans = Integer.MIN_VALUE;
    //求該點(diǎn)能向下延申的最大值
    int dfs(TreeNode root)
    {
        if(root == null)return 0;
        int left = dfs(root.left);
        int right = dfs(root.right);
        
        int temp = Math.max(left,right);
        if(temp > 0)
            temp += root.val;
        else
            temp = root.val;
        
        int val = root.val;
        if(left >= 0)val += left;
        if(right >= 0)val += right;
        ans = Math.max(ans,val);
        return temp;
    }
}

Amazing?。。?br>代碼如此優(yōu)美,每個(gè)節(jié)點(diǎn)只被訪問(wèn)一次,使得時(shí)間效率應(yīng)該也是最優(yōu)的,并且還能求出答案,真是Unbelievable!
這題還能這么解!?。∵@題讓求最大路徑和,實(shí)際上是求根節(jié)點(diǎn)向下最大延申,而路徑和只是順帶著求出來(lái)的。

為什么不直接給出答案?這是一道hard的題目,如果不寫(xiě)前面的鋪墊直接給出答案,多半是看不懂的。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74297.html

相關(guān)文章

  • 力扣(LeetCode)43

    摘要:示例輸入輸出示例輸入輸出說(shuō)明和的長(zhǎng)度小于。和均不以零開(kāi)頭,除非是數(shù)字本身。舉例說(shuō)明這兩個(gè)數(shù)的乘積的長(zhǎng)度一定不會(huì)超過(guò),分別是字符串的長(zhǎng)度。第一輪第二輪至此該數(shù)組變?yōu)槿缓笤購(gòu)奈膊刻幚磉M(jìn)位。 題目地址:https://leetcode-cn.com/probl...題目描述:給定兩個(gè)以字符串形式表示的非負(fù)整數(shù) num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示為字...

    itvincent 評(píng)論0 收藏0
  • 力扣(LeetCode)310

    摘要:圖因此可以成為樹(shù),在所有可能的樹(shù)中,具有最小高度的樹(shù)被稱(chēng)為最小高度樹(shù)。給出這樣的一個(gè)圖,寫(xiě)出一個(gè)函數(shù)找到所有的最小高度樹(shù)并返回他們的根節(jié)點(diǎn)。因此使用一個(gè)數(shù)組代表每個(gè)節(jié)點(diǎn)的入度,若入度為就是葉子節(jié)點(diǎn)。 題目地址:https://leetcode-cn.com/probl...題目描述: 對(duì)于一個(gè)具有樹(shù)特征的無(wú)向圖,我們可選擇任何一個(gè)節(jié)點(diǎn)作為根。圖因此可以成為樹(shù),在所有可能的樹(shù)中,具有最小...

    amuqiao 評(píng)論0 收藏0
  • LeetCode天梯>Day026 反轉(zhuǎn)鏈表(遞歸法+(迭代法)雙鏈表法) | 初級(jí)算法 | Py

    摘要:關(guān)于遞歸這里提一兩點(diǎn)遞歸基本有這幾步遞歸的模板,終止條件,遞歸調(diào)用,邏輯處理。 ?作者簡(jiǎn)介:大家好,我是車(chē)神哥,府學(xué)路18號(hào)的車(chē)神? ?個(gè)人主頁(yè):應(yīng)無(wú)所住而生...

    imingyu 評(píng)論0 收藏0
  • 力扣(LeetCode)452

    摘要:對(duì)于每個(gè)氣球,提供的輸入是水平方向上,氣球直徑的開(kāi)始和結(jié)束坐標(biāo)。可以射出的弓箭的數(shù)量沒(méi)有限制。弓箭一旦被射出之后,可以無(wú)限地前進(jìn)。我們想找到使得所有氣球全部被引爆,所需的弓箭的最小數(shù)量。解答這是一道區(qū)間覆蓋問(wèn)題,不太好說(shuō)清楚,利用模板即可。 題目地址:https://leetcode-cn.com/probl...題目描述:在二維空間中有許多球形的氣球。對(duì)于每個(gè)氣球,提供的輸入是水平方...

    fanux 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<