↓快轉到主要內容
  1. LeetCode/

LeetCode 133: Clone Graph

·1 分鐘· ·
LeetCode Medium Hash-Table Depth-First-Search Breadth-First-Search Graph
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2022-10-30

  • 提交紀錄:Runtime Error ×7 → Accepted ×2

解題思路
#

深拷貝一張可能有環的圖:dfs(node) 先查雜湊表,複製過就回傳那個副本;否則建立新節點,先放進雜湊表再遞迴複製鄰居(Hash Table,BFS 也可以)。先放進表裡才能處理環。輸入是空的時回傳 None。

我的嘗試
#

前幾版是語法錯誤和沒有處理空圖:輸入是 None 時讀 node.val(AttributeError)。有一版的寫法本身是對的,但同樣漏了 if not node。補上就 AC 了。

正確解法
#

class Solution:
    def cloneGraph(self, node: Optional['Node']) -> Optional['Node']:
        if not node:
            return None
        copies = {}
        def dfs(cur):
            if cur in copies:
                return copies[cur]
            copy = Node(cur.val)
            copies[cur] = copy
            copy.neighbors = [dfs(nb) for nb in cur.neighbors]
            return copy
        return dfs(node)

複雜度
#

時間 O(V + E),空間 O(V)。

要特別避免的錯誤
#

  • 先把新節點放進雜湊表再遞迴,不然環會無限遞迴。
  • 空圖要回傳 None。

面試口說整理
#

我用 DFS 搭配雜湊表記住每個舊節點對應的新節點,建立新節點後先放進表裡再複製鄰居,這樣遇到環時會直接拿到已經建立的副本;空圖回傳 None。時間 O(V + E)。

相關文章

LeetCode 417: Pacific Atlantic Water Flow
·1 分鐘
LeetCode Medium Array Depth-First-Search Breadth-First-Search Matrix
LeetCode 417 解題筆記:反過來從海邊往內走,只能走到不比自己低的格子;兩個海都走得到的格子就是答案
LeetCode 695: Max Area of Island
·1 分鐘
LeetCode Medium Array Depth-First-Search Breadth-First-Search Union-Find
LeetCode 695 解題筆記:每遇到一個沒走過的 1 就 DFS 整座島,數格子數,取最大值;格子是整數 1,不是字串
LeetCode 1448: Count Good Nodes in Binary Tree
·1 分鐘
LeetCode Medium Tree Depth-First-Search Breadth-First-Search Binary-Tree
LeetCode 1448 解題筆記:DFS 往下傳路徑上的最大值,節點的值大於等於它就是好節點
LeetCode 199: Binary Tree Right Side View
·1 分鐘
LeetCode Medium Tree Depth-First-Search Breadth-First-Search Binary-Tree
LeetCode 199 解題筆記:層序遍歷,每一層最右邊的節點就是從右邊看得到的
LeetCode 102: Binary Tree Level Order Traversal
·1 分鐘
LeetCode Medium Tree Breadth-First-Search Binary-Tree
LeetCode 102 解題筆記:BFS 一次處理一整層,用目前這層的節點產生下一層;空樹回傳空 list
LeetCode 105: Construct Binary Tree from Preorder and Inorder Traversal
·1 分鐘
LeetCode Medium Array Hash-Table Divide-and-Conquer Tree
LeetCode 105 解題筆記:前序的第一個是根,在中序裡找到根的位置就知道左子樹有幾個節點;用字典查位置,O(n)