133. Clone Graph 克隆图
給你無向 連通 圖中一個節點的引用,請你返回該圖的 深拷貝(克隆)。
圖中的每個節點都包含它的值 val(int) 和其鄰居的列表(list[Node])。
class Node {public int val;public List<Node> neighbors; }測試用例格式:
簡單起見,每個節點的值都和它的索引相同。例如,第一個節點值為 1(val = 1),第二個節點值為 2(val = 2),以此類推。該圖在測試用例中使用鄰接列表表示。
鄰接列表 是用于表示有限圖的無序列表的集合。每個列表都描述了圖中節點的鄰居集。
給定節點將始終是圖中的第一個節點(值為 1)。你必須將 給定節點的拷貝 作為對克隆圖的引用返回。
示例 1:
輸入:adjList = [[2,4],[1,3],[2,4],[1,3]]
輸出:[[2,4],[1,3],[2,4],[1,3]]
解釋:
圖中有 4 個節點。
節點 1 的值是 1,它有兩個鄰居:節點 2 和 4 。
節點 2 的值是 2,它有兩個鄰居:節點 1 和 3 。
節點 3 的值是 3,它有兩個鄰居:節點 2 和 4 。
節點 4 的值是 4,它有兩個鄰居:節點 1 和 3 。
示例 2:
輸入:adjList = [[]]
輸出:[[]]
解釋:輸入包含一個空列表。該圖僅僅只有一個值為 1 的節點,它沒有任何鄰居。
示例 3:
輸入:adjList = []
輸出:[]
解釋:這個圖是空的,它不含任何節點。
示例 4:
輸入:adjList = [[2],[1]]
輸出:[[2],[1]]
提示:
DFS
題目只給了我們一個節點的引用,因此為了知道整張圖的結構以及對應節點的值,我們需要從給定的節點出發,進行「圖的遍歷」,并在遍歷的過程中完成圖的深拷貝。
為了避免在深拷貝時陷入死循環,我們需要理解圖的結構。對于一張無向圖,任何給定的無向邊都可以表示為兩個有向邊,即如果節點 A 和節點 B 之間存在無向邊,則表示該圖具有從節點 A 到節點 B 的有向邊和從節點 B 到節點 A 的有向邊。
為了防止多次遍歷同一個節點,陷入死循環,我們需要用一種數據結構記錄已經被克隆過的節點。
Code
class Solution:def __init__(self):self.visited = {}def cloneGraph(self, node: 'Node') -> 'Node':if not node:return nodeif node in self.visited:return self.visited[node]cloneNode = Node(node.val, [])self.visited[node] = cloneNodeif node.neighbors:cloneNode.neighbors = [self.cloneGraph(n) for n in node.neighbors]return cloneNode復雜度分析
-
時間復雜度:O(N)O(N)O(N),其中 NNN 表示節點數量。深度優先搜索遍歷圖的過程中每個節點只會被訪問一次。
-
空間復雜度:O(N)O(N)O(N)。存儲克隆節點和原節點的哈希表需要 O(N)O(N)O(N) 的空間,遞歸調用棧需要 O(H)O(H)O(H) 的空間,其中 HHH 是圖的深度,經過放縮可以得到 O(H)=O(N)O(H) = O(N)O(H)=O(N),因此總體空間復雜度為 O(N)O(N)O(N)。
總結
以上是生活随笔為你收集整理的133. Clone Graph 克隆图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2020\Simulation_1\6.
- 下一篇: 43. Multiply Strings