684. Redundant Connection
題目網址:https://leetcode.cn/problems/redundant-connection/
題意:給一
n
個 node 的 tree(編號從1
到n
), 並在其中添加一條邊。添加的邊其兩個頂點包含在1
到n
中間, 且這條邊不屬於 tree 中已存在的邊。edges[i] = [a, b]
表示圖中a
和b
之間存在一條邊。找出一條可以刪去的邊, 刪除後可使得剩餘部分為 tree。如果有多個答案, 則返回這些答案在
edges
中順序最後的那條邊。
Solution 1:
想法:同 261. Graph Valid Tree, 利用 DFS, 每次加入一條 edge
e
, 就檢查是否有 cycle, 一旦發現了 cycle, 就返回e
(最後加入形成 cycle 的 edge)
- 令
e
的兩端點分別為u
、v
, 檢查是否已經有 path 能連接u
、v
。若有, 則代表加入e
後會形成 cycle- 由於為無向圖, 所以遞迴遍歷時需要用
visited
紀錄哪些 node 已經拜訪過, 一旦拜訪過就不再遞迴遍歷。假設 edgee = [u,v]
, 則u
、v
之間並無 cycle, 若不用visited
紀錄, 則會發生u -> v
、v -> u
, 因而得出u
、v
之間存在 cycle 的錯誤判斷。
class Solution { |
- time:$O(n^2)$ ➔ 其中
n
代表 edge、node 數- $O(n^2)$:worse case 對於每次新增的 edge
e
, 必須搜索圖中之前出現的每條 edge
➔ $1 + 2 + … + n$ = $\dfrac{(n + 1) \cdot n}{2}$
- $O(n^2)$:worse case 對於每次新增的 edge
- space:$O(n)$ ➔
adj
的 avg case 為 $O(V + E)$, 本題的V
、E
皆為n
(因為是 tree + 1 edge)
Solution 2:
想法:同 261. Graph Valid Tree, 利用 Union Find + Path Compression, 用 Union Find 合併每條邊的兩個 node 時, 如果這兩個 node 已經在同一 set 中, 則存在 cycle
e.g.
edges = [[1,2], [1,3], [2,3]]
- 當完成
[1,2]
和[1,3]
時,parents[2] = 1 = parent[3]
- 然後執行
[2,3]
時, 因為parents[2] == parents[3]
代表有 cycle
class Solution { |
- time:$O(n)$ ➔ 遍歷每個 node 初始化
parents
, 以及遍歷每條 edge 做 union find, 而 edge 的兩端點做find()
皆只需 $O(1)$, 其中 node、edge 數皆為n
- space:$O(n)$ ➔
parent
,ranks
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論