给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。

图中的每个节点都包含它的值 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]]

提示:

  1. 节点数不超过 100 。
  2. 每个节点值 Node.val 都是唯一的,1 <= Node.val <= 100。
  3. 无向图是一个简单图,这意味着图中没有重复的边,也没有自环。
  4. 由于图是无向的,如果节点 p 是节点 q 的邻居,那么节点 q 也必须是节点 p 的邻居。
  5. 图是连通图,你可以从给定节点访问到所有节点。

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 克隆图相关推荐

  1. 【重点!DFS/记忆化递归 + BFS】LeetCode 133. Clone Graph

    LeetCode 133. Clone Graph Solution1: DFS/记忆化递归,参考网址:http://www.cnblogs.com/grandyang/p/4267628.html ...

  2. 133. Clone Graph

    欢迎fork and star:Nowcoder-Repository-github 133. Clone Graph 题目 Clone an undirected graph. Each node ...

  3. [Leetcode][第133题][JAVA][克隆图][DFS][BFS][深拷贝]

    [问题描述][中等] [解答思路] 其实就是深拷贝的一个实现,深拷贝就是对于所有的指针成员,不能仅仅是赋值,还有重新分配空间. 深拷贝反应在本题中就是,所有的结点需要重新new出来,而不是直接赋值. ...

  4. 力扣133. 克隆图

    该题克隆图类似二叉树的遍历,是从根节点遍历叶节点. 复制思路:是dfs遍历原节点node,建立HashMap<Node,Node>原节点到克隆节点的映射,然后根据原节点,new出新节点,建 ...

  5. Leetcode 133.克隆图

    Time: 20190903 Type: Medium 题目描述 给定无向连通图中一个节点的引用,返回该图的深拷贝(克隆).图中的每个节点都包含它的值 val(Int) 和其邻居的列表(list[No ...

  6. graph 关系图 设置

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  7. 图形结构:克隆图,图的遍历的应用,递归和迭代

    克隆一张无向图,图中的每个节点包含一个 label (标签)和一个 neighbors (邻接点)列表 . 克隆图时图的遍历的应用,树的遍历,图的遍历是最基本的操作,他们和数组的遍历是一样的,线性结构 ...

  8. 作文以记之 ~ 克隆图

    作文以记之 ~ 克隆图 0.前言 1.题目描述 2.解题思路 2.1 方法1 ~ 利用BFS 2.1.1 思路 2.1.2 程序代码 2.2 方法2 ~ 利用 DFS 2.2.1 思路 2.2.2 程 ...

  9. Graph Representation 图神经网络

    Graph Representation 图神经网络 图表示学习(representation learning)--图神经网络框架,主要涉及PyG.DGL.Euler.NeuGraph和AliGra ...

最新文章

  1. uiautomatorviewer_【问题】解决Android8.0以上运行不了uiautomatorviewer的办法
  2. 上传图片到第三方服务器
  3. css绝对定位如何在不同分辨率下的电脑正常显示定位位置?
  4. 解决thinkphp在nginx环境中由于PATH_INFO变量引起的路径问题
  5. 塞尔达传说gba_【译介】塞尔达传说:不可思议的帽子2004年开发者访谈
  6. mysql无法存储文字_mysql存储不了中文字符串怎么办
  7. shiro学习(21):动态添加验证规则1
  8. 思考:日期类型的数据应该用什么样的具体形式存储到数据库?
  9. python内置类型和类_python – 内置类型和用户定义之间的不一致
  10. 【win10】装机必备推荐软件,提升你的计算机使用效率!
  11. UE4官网文档关于多人局域网游戏
  12. mysql 数据字典导出_MySQL导出数据字典
  13. 酒店管理系统(功能结构图、流程图)
  14. VS中*.clw *.ncb *.opt *.aps这些文件是做什么用的?
  15. Android 8.1 应用安装过程总结
  16. WPF 使用Quartz MS字体
  17. 差点就给牦牛剪毛了!
  18. 最新模版兔-基于laysns系统开发2.55可用
  19. IPFS的Python API参考手册
  20. ambari mysql配置修改_Ambari 安裝配置 MySql

热门文章

  1. Link Cut Tree学习笔记
  2. 死磕算法第二弹——栈、队列、链表(5)
  3. sqlite3存储格式
  4. 线程池:ThreadPoolExecutor
  5. C语言标准库函数qsort具体解释
  6. VBS 连接数据库 - 样例
  7. java 流拆分_java - 在Java流中拆分字符串? - SO中文参考 - www.soinside.com
  8. ateq测漏仪f620中文说明书_Yaman雅萌美容仪详细介绍及2019年韩国免税店最新报价...
  9. C语言学习之编程输入x,输出对应的y.
  10. php编译freetds,Linux 下 PHP 5.2.x 连接 SQL Server 数据库 FreeTDS 配置笔记