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!
評論
