前往
大廳
主題

LeetCode - 2581. Count Number of Possible Root Nodes 解題心得

Not In My Back Yard | 2024-02-05 12:00:13 | 巴幣 0 | 人氣 52

題目連結:


題目意譯:
Alice 有一個無向樹,其有著 n 個編號為 0 到 n - 1 的節點。該樹將以一個長度為 n - 1 的二維整數陣列 edges 所表示,其中 edges[i] = [ai, bi] 代表著在樹中節點 ai 到節點 bi 之間有一條邊。

Alice 想要 bob 去找到樹的根節點。她允許 Bob 為她的樹作若干次猜測。在一次猜測中,他將會做以下事情:
    選擇兩個相異整數 u 和 v 使得樹中存在著 [u, v] 這條邊。
    他將告訴 Alice u 在樹中是 v 的父母節點。

Bob 的猜測將會被以一個二維整數陣列 guesses 所表示,其中 guesses[j] = [uj, vj] 代表著 Bob 猜 uj 是 vj 的父母節點。

Alice 很懶,不想每次都回答 Bob 的猜測,而只告訴他至少 k 個猜測是正確的。

給定二維整數陣列 edges 、 guesses 和一個整數 k,回傳 Alice 的樹中可能為根節點的節點數。如果不存在這樣子的節點,則回傳 0。

限制:
edges.length == n - 1
2 ≦ n ≦ 10 ^ 5
1 ≦ guesses.length ≦ 10 ^ 5
0 ≦ ai, bi, uj, vj ≦ n - 1
ai != bi
uj != vj
edges 代表著一棵合法樹。
guesses[j] 是樹中的一條邊。
guesses 彼此相異。
0 ≦ k ≦ guesses.length



範例測資:
範例 1:
輸入: edges = [[0,1],[1,2],[1,3],[4,2]], guesses = [[1,3],[0,1],[1,0],[2,4]], k = 3
輸出: 3
解釋:
根節點 = 0,正確的猜測將會是 [1,3] 、 [0,1] 、 [2,4]
根節點 = 1,正確的猜測將會是 [1,3] 、 [1,0] 、 [2,4]
根節點 = 2,正確的猜測將會是 [1,3] 、 [1,0] 、 [2,4]
根節點 = 3,正確的猜測將會是 [1,0] 、 [2,4]
根節點 = 4,正確的猜測將會是 [1,3] 、 [0,0]
把 0 、 1 或 2 當作根節點將會得到 3 個正確猜測。

範例 2:
輸入: edges = [[0,1],[1,2],[2,3],[3,4]], guesses = [[1,0],[3,4],[2,1],[3,2]], k = 1
輸出: 5
解釋:
根節點 = 0,正確的猜測將會是 [3,4]
根節點 = 1,正確的猜測將會是 [1,0] 、 [3,4]
根節點 = 2,正確的猜測將會是 [1,0], [2,1], [3,4]
根節點 = 3,正確的猜測將會是 [1,0], [2,1], [3,2], [3,4]
根節點 = 4,正確的猜測將會是 [1,0], [2,1], [3,2]
把任一一個節點當作根節點將會得到 1 個正確猜測。


解題思維:
(假設你已經先將給定的 edges,轉成鄰接表(Adjacency List)之形式,參見這題
先隨便用一個節點當做根節點,例如說範例程式碼中以節點 0 作為一開始的根節點。接著求出以該節點的情況下,guesses 會滿足幾個。而這可以直接用一次深度優先搜尋(Depth First Search,DFS)加上雜湊表等資料結構來快速找到某條邊是否存在於 guesses 中。



假設現在看到了 C 個符合條件的猜測。接下來,我們再從我們一開始假定的根節點再做一次 DFS。而這次每看到一個節點就將根節點更改成現在看到的節點(如範例程式碼,一開始會是節點 0;接著會轉成節點 0 的某個鄰居;再來是節點 0 的某個鄰居的某個鄰居,以此類推)。

可以看到當我們從現在的節點 x 作為根節點的時候,轉變成以鄰居 y 作為根節點時,實際上只會影響到 x 到 y 這條邊而已。也就是原本 x 是根節點時,x 是 y 的父母節點、而換成 y 是根節點後,則是反過來。

因此我們只要判斷 [x, y] 和 [y, x] 是否在 guesses 中:
    如果兩者都在其中,則 C 值不變;
    如果只有 [x, y],則 C 值將減去 1;
    如果只有 [y, x],則 C 值將加上 1;
    以上皆非,則 C 值也不變。

因此我們便可以很簡單地就轉成以某個鄰居作為根節點時對應的 C 值。接著我們只要判斷有多少根節點對應的 C 值 ≧ k 即為所求。




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

創作回應

更多創作