当前位置: 首页> 文旅> 酒店 > 【LeetCode】133.克隆图

【LeetCode】133.克隆图

时间:2025/7/9 1:11:06来源:https://blog.csdn.net/liu16659/article/details/140910535 浏览次数:0次

本题的一个难点是:

1. 题目

这是一道很好的题目,至少把目前的我给困住了。

2. 分析

我的思路是深度搜索,深搜的同时记录上一次访问的节点(也就是当前节点的父节点)是什么。然后记录一个节点关系即可,代码如下:

"""
# Definition for a Node.
class Node:def __init__(self, val = 0, neighbors = None):self.val = valself.neighbors = neighbors if neighbors is not None else []
"""from typing import Optional
class Solution:def cloneGraph(self, node: Optional['Node']) -> Optional['Node']:vis = set() # 正在访问的节点pre = Noneroot = self.dfs(pre, node, vis)print(root.val)return rootdef dfs(self, pre, cur, vis):print("1",cur.val)node = Node()if cur:vis.add(cur.val)node.val = cur.valelse:returnif pre :pre.neighbors.append(node)node.neighbors.append(pre)# 找出所有的邻居节点for nei in cur.neighbors:print("2",nei.val)if nei.val not in vis:self.dfs(node, nei, vis)return node

上面这版代码存在的一个问题是:就是存在漏访问的情况。也就是如下这两行红框中的代码导致:
在这里插入图片描述

例如在样例:[[2,4],[1,3],[2,4],[1,3]]中(对应的图是如下所示),
在这里插入图片描述
这版代码就会造成1<=>4 的漏访问。更深层次的原因是:这版代码是在深搜的时候clone对应的节点,但如果没深搜到这个节点,就没法clone这个邻居,而vis数组导致不会深搜到这个节点,从而产生遗漏。

3. 代码

我看了一下官方题解,代码写的确实比我好。官方题解的思想就是:使用一个哈希表存储某个节点被clone的节点。如果某节点没有被clone过,那么继续深搜;如果有,那么及时返回。在深搜的过程中维护好邻居关系即可。

关键字:【LeetCode】133.克隆图

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: