力扣中國 · #133
克隆图(Clone Graph)
使用 DFS 與哈希表映射實現圖的深克隆,有效處理環路與重複節點。
開啟原題 ↗時間複雜度O(N),其中 N 為圖中節點數。每個節點和每條邊僅被訪問一次。
空間複雜度O(N),其中 N 為圖中節點數。遞迴棧深度最壞情況為 N,且 `visited` 字典儲存 N 個映射關係。
解釋模型qwen/qwen3.8-27b
解題思路
久沒寫了,有點卡,f可以直接替代cloneGraph
此解法採用深度優先搜尋(DFS)來複製圖結構。核心在於使用一個字典 visited 作為「原節點」到「克隆節點」的映射表,以處理圖中的環路並避免無限遞迴。
- 狀態追蹤:
visited字典記錄了已經被克隆過的節點。當遇到一個節點時,若它已存在於字典中,直接返回對應的克隆節點,確保每個節點只被克隆一次,並正確連接已存在的節點。 - 遞迴克隆:函數
f首先檢查輸入節點是否為空或已訪問。若未訪問,則建立一個具有相同值但鄰居列表為空的新節點,並立即將「原節點 -> 新節點」的映射存入visited。這一步至關重要,因為在處理鄰居之前必須先註冊當前節點,以應對自環或環路情況。 - 鄰居處理:遍歷原節點的鄰居列表,對每個鄰居遞迴呼叫
f,並將返回的克隆節點加入當前克隆節點的鄰居列表中。 - 入口點:
cloneGraph函數僅作為包裝器,直接呼叫f並返回結果。作者提到的「f可以直接替代cloneGraph」是指f包含了完整的邏輯,cloneGraph僅需透傳參數。
通過的程式碼
"""
# Definition for a Node.
class Node:
def __init__(self, val = 0, neighbors = None):
self.val = val
self.neighbors = neighbors if neighbors is not None else []
"""
from typing import Optional
class Solution:
def __init__(self,):
self.visited = dict()
def f(self, node):
if not node: return node
if node in self.visited:
return self.visited[node]
clone_node = Node(node.val, [])
self.visited[node] = clone_node
for n in node.neighbors:
clone_node.neighbors.append(self.f(n))
return clone_node
def cloneGraph(self, node: Optional['Node']) -> Optional['Node']:
return self.f(node)