嗯...,這題是要在二元樹中分錢,樹中的錢幣量剛好會等於節點的數量
分的方式就是分到每一個節點都有一枚錢幣,然後看總共要移動錢幣幾次這樣,移動"一個錢幣"就算一次
以這個圖為例,就是移動兩次,這個圖是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上一個大神的解說圖,我覺得滿詳細的,可以參考一下
我看到的解法都大同小異啦,大概的概念都是這樣
那麼這題就這樣了,是說我每次解一解就忘,到底有沒有用啊
大概就... 熟能生巧吧XD
留言列表