close

嗯...,這題是要在二元樹中分錢,樹中的錢幣量剛好會等於節點的數量

分的方式就是分到每一個節點都有一枚錢幣,然後看總共要移動錢幣幾次這樣,移動"一個錢幣"就算一次

以這個圖為例,就是移動兩次,這個圖是leetcode上貼過來的

 

Sol:

這題我想了很久,廢物如我最後還是去看答案了...

總之要有一個概念就是,每個硬幣要自己留一個錢幣,如果自己沒有要拉一個錢幣進來

 

假設一個節點的錢幣數量為n,那麼當 n > 0 時,要移動的步數就是 n - 1 步

如果 n = 0 ,移動的步數就是-1,代表拉一個錢幣進來,在計算的時候也是算成一步

 

如果有這個概念,就會比較好理解了

除了本身本來的n個錢幣之外,上還要加上從其他節點送過來的錢幣

因為是二元樹嘛,所以每個節點要計算的錢幣量會等於:

左邊節點移動的錢幣 + 右邊節點移動的錢幣 + 本身本來的錢幣量

 

所以...,大概會長成底下這樣:

class Solution {
public:
    int dfs(TreeNode* root, int& res)
    {
        if (root == NULL)
            return 0;
        
        int left = dfs(root->left, res);
        int right = dfs(root->right, res);
        
        res += abs(left) + abs(right);
        
        return root->val - 1 + left + right;
    }

    int distributeCoins(TreeNode* root) {
        int res = 0;
        
        dfs(root, res);
        
        return res;
    }
};

 

注意一下那個絕對值,因為從別的節點拉一個錢幣過來在計算上是-1個錢幣,但同樣是移動一步,所以在計算移動步數的時候要加上絕對值

下面這個圖是leetcode上一個大神的解說圖,我覺得滿詳細的,可以參考一下

image

我看到的解法都大同小異啦,大概的概念都是這樣

那麼這題就這樣了,是說我每次解一解就忘,到底有沒有用啊

大概就... 熟能生巧吧XD

 

 

 

 

 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 頁頁頁六滴 的頭像
    頁頁頁六滴

    人森很精彩,所以要把所有事情都記起來=ˇ=

    頁頁頁六滴 發表在 痞客邦 留言(0) 人氣()