複製圖 | Medium | LeetCode#133. Clone Graph
題目敘述

- 題目難度:
Medium - 題目描述: 題目給定了一個 connected undirect graph 中節點的參考設計,希望你回傳這個 graph 的 Deep Copy
1 | class Node { |
其實看到 Deep Copy 就可以想的是要用 Hash Table 了
這題還有說明,這題節點的 index 與節點的 value 相同,也就是第一個節點的 val 就會是 1 ,而第二個節點的 val 就會是 2 以此類推。 然後題目會給定一個 adjacency list 這個 list 中的每個 sublist 都描述了個別節點與其他節點的相鄰狀況,例如:
1 | adjList = [[2,4],[1,3],[2,4],[1,3]] |
這代表第ㄧ個節點 (index=0) 的鄰接節點有 val==2 以及 val==4 的節點。 而這代表第二個節點 (index=1) 的鄰接節點有 val==1 以及 val==3 的節點,以此類推。
解法
一開始的想法
我的想法就是要透過 hash table 紀錄原先節點以及新節點之間的對應關係,邏輯會有點像是這題 LeetCode#138. Copy List with Random Pointer,透過建立節點的 hash table 可以輕易的進行 deep copy。所以為了要將節點保存到 Hash Table 需要先對 Graph 進行 Traversal。
我的解法
1 | /* |
這裡首先先宣告 Hash Table unordered_map<Node*, Node*> nodeMap 以及用於進行 BFS 的 queue nodeToVisit,接著就會將初始節點 node push 進 queue 中,並且將其保存於 hash table 中,這一步驟同時會在 node 這個 key 對應到新建立的節點,並且該節點具有與 node 相同的節點值 (nodeMap[node] = new Node(node->val))。
接著就能夠進行 BFS Traversal,當 queue 未空時,取出 front 節點作為當前的搜尋起點,接折會去迭代 current 的 adjacency list neighbors 若在 nodeMap 中沒有找到該節點為 key 的 entry 則這時會去新增一筆 entry,並且會把該節點 push 進入queue 中作為之後的搜尋起點。接著就是要把 current 所有的鄰接節點都更新到 nodeMap[current] (也就是對應的新節點) 的 adjacency list (nodeMap[current]->neighbors.push_back(nodeMap[n]);)
函數的最後回傳任意新節點。
執行結果

複雜度
時間複雜度
$O(N+ E)$:使用 queue 進行 BFS 遍歷,每個節點被訪問一次,每條邊也被處理一次,$N$ 為圖中節點數量,而 $E$ 為邊的數量
空間複雜度
$O(1)$









