题目描述
思路解析动画文字版
记住「先查表、没有才新建」这一招,下面每一步都在用它。
原图在这里:6 个节点、若干条边。我们要在右侧逐个建出它们的副本。
访问节点 1:查哈希表 map,里面还没有它 → 新建副本 1',并写入 map[1]=1'。
节点 1 克隆完成,加入「已克隆」面板。它的邻居稍后入队,依次同样处理。
访问节点 2:查哈希表 map,里面还没有它 → 新建副本 2',并写入 map[2]=2'。
节点 2 克隆完成,加入「已克隆」面板。它的邻居稍后入队,依次同样处理。
连边:原图里 1—2 相邻,于是在克隆图里把副本 1' 和 2' 也连起来(map 里取出两端的克隆节点)。
访问节点 4:查哈希表 map,里面还没有它 → 新建副本 4',并写入 map[4]=4'。
节点 4 克隆完成,加入「已克隆」面板。它的邻居稍后入队,依次同样处理。
连边:原图里 1—4 相邻,于是在克隆图里把副本 1' 和 4' 也连起来(map 里取出两端的克隆节点)。
访问节点 3:查哈希表 map,里面还没有它 → 新建副本 3',并写入 map[3]=3'。
节点 3 克隆完成,加入「已克隆」面板。它的邻居稍后入队,依次同样处理。
连边:原图里 1—3 相邻,于是在克隆图里把副本 1' 和 3' 也连起来(map 里取出两端的克隆节点)。
访问节点 5:查哈希表 map,里面还没有它 → 新建副本 5',并写入 map[5]=5'。
节点 5 克隆完成,加入「已克隆」面板。它的邻居稍后入队,依次同样处理。
连边:原图里 1—5 相邻,于是在克隆图里把副本 1' 和 5' 也连起来(map 里取出两端的克隆节点)。
连边:原图里 2—3 相邻,于是在克隆图里把副本 2' 和 3' 也连起来(map 里取出两端的克隆节点)。
连边:原图里 2—5 相邻,于是在克隆图里把副本 2' 和 5' 也连起来(map 里取出两端的克隆节点)。
连边:原图里 4—3 相邻,于是在克隆图里把副本 4' 和 3' 也连起来(map 里取出两端的克隆节点)。
访问节点 6:查哈希表 map,里面还没有它 → 新建副本 6',并写入 map[6]=6'。
节点 6 克隆完成,加入「已克隆」面板。它的邻居稍后入队,依次同样处理。
连边:原图里 4—6 相邻,于是在克隆图里把副本 4' 和 6' 也连起来(map 里取出两端的克隆节点)。
连边:原图里 3—6 相邻,于是在克隆图里把副本 3' 和 6' 也连起来(map 里取出两端的克隆节点)。
全部节点都克隆了、全部边都连上了——右侧面板里 6 个副本就是这张图的深拷贝,返回起点的副本即可。
边界先想清。
两个高频追问。
参考代码
def cloneGraph(node): if not node: return None mp = {} # 原节点 -> 克隆节点 q = deque([node]) mp[node] = Node(node.val) # 先克隆起点 while q: cur = q.popleft() for nb in cur.neighbors: if nb not in mp: # 没克隆过才新建 mp[nb] = Node(nb.val) q.append(nb) mp[cur].neighbors.append(mp[nb]) # 连克隆边 return mp[node]复杂度
- 时间:O(V+E),每个节点访问一次、每条边处理一次
- 空间:O(V),哈希表存 V 个映射 + 队列
易错点
面试追问把动画讲成自己的话
追问DFS 还是 BFS 都能做吗?
追问为什么不能简单地新建结构后再连边?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
岛屿的最大面积
LeetCode 695 · 中等 · 沿着 图 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题