前往
大廳
主題

LeetCode - 337. House Robber III 解題心得

Not In My Back Yard | 2022-06-25 12:00:01 | 巴幣 0 | 人氣 201

題目連結:


題目意譯:
竊賊又找到了一塊新的地區來竊盜。此區域只有一個入口,此稱為 root。

除了 root 以外,每間房子只有唯一一間作為「父節點」的房子。逛了一下這個區域後,聰明的竊賊意識到這區域中所有房子形成了一棵二元樹。如果兩間直接鏈結的房子在同一晚同時被闖入的話,將會通知警察。

給定二元樹的根節點 root,回傳一晚內在不驚動警察的狀況下,竊賊可以搶得的最大金額為何。

限制:
樹中的節點數量位於範圍 [1, 10 ^ 4] 中。
0 ≦ Node.val ≦ 10 ^ 4



範例測資:
範例 1:
輸入: root = [3,2,3,null,3,null,1]
輸出: 7
解釋: 竊賊能搶得最大金額 = 3 + 3 + 1 = 7。

範例 2:
輸入: root = [3,4,5,1,3,null,1]
輸出: 9
解釋: 竊賊能搶得最大金額 = 4 + 5 = 9。


解題思維:
核心精神跟系列第一題(即這題)基本上是一樣的。

定義 DX 為只考慮節點 X 下形成的子樹且在必須搶節點 X 能搶得的金額最大值;而 RX 為只考慮節點 X 下形成的子樹且在不得搶節點 X 能搶得的金額最大值。因此可以看到所求為 max(Droot, Rroot)。

假設節點 X 的左子小孩為 X->left 且其右下小孩為 X-right。因此可以看到遞迴式為
DX = RX->left+ RX->right + 節點 X 之值;
RX = max(DX->left, RX->left) + max(DX->right, RX->right)。

至於計算的順序可以單純地遞迴即可(當然,想要從葉節點往上推回到 root 也是可以的)。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作