無向圖中連通元件的數量 | Medium | LeetCode#323. Number of Connected Components in an Undirected Graph
題目敘述

- 題目難度:
Medium - 題目描述: 給定一張圖中有
n個節點,以及一個陣列edges其中edges[i] = [a_i, b_i]代表從節點A到節點B存在 Edge,本題要求回傳這個圖紹 Connected Components 的數量。
解法
一開始的想法
由於題目給得是 edge 的陣列,可以由此陣列去建構出一個 n x n 的鄰接矩陣,如果矩陣中有值就為 true 開始針對已經有 true 的節點進行 DFS 然後每次返回到 Caller 時就讓某變數 sum 增加一,最後再回傳 sum 即可,就代表 Connected Components 的數量。
但
n x n的鄰接矩陣,如果想要去選取出發點,勢必須要透過雙重迴圈來尋找,只要n夠大就會 Time Limit Excced,因此改良做法是改成鄰接串列(Adjacency List)
我的解法
1 | class Solution { |
在 countComponents 中初始化鄰接串列 adjList , 用於儲存走訪狀態的陣列 visited 以及紀錄 connected components 數量的變數 sum 之後將 adjList 初始化大小為 n。
建構 adList 的時候,可以回憶一下鄰接串列的特性,對於每個節點 i,其 subVector 的元素就是與 i 相鄰的節點
1 | [ |
對於每個 edges[i] 其第一個元素 edges[i][0] 要作為 adjList 的 index 然後將對應接到的node edges[i][1] push到 subVector。另外本題是一個無向圖,因此只要存在 [a_i, b_i] 那一定也存在 [b_i, a_i]。所以也需要將 edges[i][1] 作為 index 然後將其 edges[i][0] push 到 subvector 中。
後面尋找起點主要是迭代 visited[n] 只要發現有尚未造訪的節點 (visited[i]== false),就會去進行DFS。在 DFS 過程中,每次帶訪節點會去將 visited[node] 標注為已造訪 (true)。在 dfs 中,對於每個傳入的 node會去透過 adjList 看其對應的 subVector 是否有相鄰的節點是尚未造訪的,但如果造訪過了就會回傳。 只要 dfs結束回到 countComponents 的時候就代表已經走房完成一個 Connected Components,此時可以將 sum 增加。 走訪完全圖後就回傳 sum。
執行結果

複雜度
時間複雜度
$O(V+E)$ 建構 adjList 會需要拜訪 E 個 edge,另外走訪完全圖,一共會走訪到 V 個節點。
空間複雜度
$O(V+E)$ 需要儲存 V 個節點 並且有 E個 edge









