前往
大廳
主題

LeetCode - 2049. Count Nodes With the Highest Score 解題心得

Not In My Back Yard | 2022-04-11 00:00:09 | 巴幣 100 | 人氣 175

題目連結:


題目意譯:
現在有一棵有著 n 個節點的二元樹,其根節點為 0。節點編號為 0 到 n - 1。你被給定一個索引值從 0 開始數的整數陣列 parents 代表著這棵樹,其中 parents[i] 為編號 i 的節點之父母節點。由於節點 0 為根節點,因此 parents[0] == -1。

每個節點有著一個分數值。為了計算一個節點的分數值,考慮該節點以及所有連到該節點的邊被移除後的圖。原本的樹將變為一個或多個非空的子樹。一個子樹的大小為其含有的節點個數。而被移除的節點之分數值即為這些子樹大小之乘積值。

回傳有著最高分數值的節點個數。

限制:
n == parents.length
2 ≦ n ≦ 10 ^ 5
parents[0] == -1
0 ≦ parents[i] ≦ n - 1 for i != 0
parents 代表著一棵合法的二元樹。



範例測資:
範例 1:
輸入: parents = [-1,2,0,2,0]
輸出: 3
解釋:
- 節點 0 的分數值為 3 × 1 = 3
- 節點 1 的分數值為 4 = 4
- 節點 2 的分數值為 1 × 1 × 2 = 2
- 節點 3 的分數值為 4 = 4
- 節點 4 的分數值為 4 = 4
最高的分數值為 4,而有三個節點(節點 1 、 3 和 4)有著最高的分數值。

範例 2:
輸入: parents = [-1,2,0]
輸出: 2
解釋:
- 節點 0 的分數值為 2 = 2
- 節點 1 的分數值為 2 = 2
- 節點 2 的分數值為 1 × 1 = 1
最高的分數值為 2,而有兩個節點(節點 0 和 1)有著最高的分數值。


解題思維:
首先我們把所有邊掃過一次,使得每個節點也知道其小孩是哪些節點(方便之後使用)。

接著我們利用深度優先搜尋(Depth First Search,DFS)去求出以每個節點作為根節點的子樹之節點個數為何。在過程中(假設我們目前在節點 i):
先根據節點 i 的小孩數量遞迴求得子樹節點個數 L 、 R,以及兩者之乘積(沒有小孩,則當作是 L = R = 0 且乘積 = 1。此時的乘積值不影響答案)

接著判斷節點 i 是不是整棵的根節點(即 i 是否為 0)。如果不是的話,則我們還會生出另一個子樹,該子樹為整棵樹扣掉以節點 i 作為根節點的子樹(也就是本層遞迴所代表的這棵子樹),因此節點 i 的分數值為先前的子樹節點個數乘積值 × (n - L - R - 1);反之,代表 i = 0,此時只有小孩所形成的子樹,因此分數值為剛剛上面求得的子樹節點個數乘積值。

過程中有多少個節點分數值恰好是最大的,該數量即為所求。




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

創作回應

更多創作