0133 Solved

This commit is contained in:
Yuhang Peng 2020-05-03 18:57:49 -07:00
parent 750635b5f7
commit 7824b97ede
3 changed files with 65 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 MiB

Binary file not shown.

View File

@ -0,0 +1,65 @@
# LeetCode 133 号问题克隆图
> 本文首发于公众号图解面试算法 [图解 LeetCode ](<https://github.com/MisterBooo/LeetCodeAnimation>) 系列文章之一
>
> 同步博客https://www.algomooc.com
题目来源于 LeetCode 上第 133 号问题克隆图题目难度为 Medium目前通过率为 54.8%
### 题目描述
给你无向连通图中一个节点的引用请你返回该图的深拷贝克隆图中的每个节点都包含它的值 valint和其邻居的列表list[Node]
**示例 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 = [[2],[1]]
输出[[2],[1]]
```
### 题目解析
给你一个图让你完整地拷贝一份这道题目不难但是在实际的工作项目中却时常遇到这道题目有很多种解法但是建议站在实际工作的角度去思考
图是由一个个节点组成的完整地拷贝一份图那么就意味着我们要对每个节点进行拷贝而且节点与节点的关系也要拷贝过来做到这一点也不难我们只需要遍历一遍图就可以了这里的关键点在于题目强调是 **无向图**也就是说我们可以从图上的任意点出发到达图上的所有节点那么问题从而就转换到了如何遍历图我们可以使用广度优先搜索也可以使用深度优先搜索从工作的角度出发比较推荐广度优先搜索因为理解容易实现简单而且不涉及栈溢出的问题处理大规模数据比较安全
<br>
### 动画演示
![](../Animation/133.gif)
<br>
### 复杂度分析
一般使用广度优先搜索遍历图时间复杂度是 `O(n + m)`其中这里的 n 表示的是图上的节点数m 表示的图上的边的数量从广度优先搜索的 **由点及面** 的性质你不难理解这个结果极端情况下当这张图是一张全联通的图时间复杂度就会是 `O(n^2)`解释起来也很容易因为你每访问完一个节点下面都会去访问相邻的节点一个节点和所有的节点相连那么在一个节点上花费的时间就是 n n 节点上花费的时间就是 n^2因为我们使用了队列存放接下来需要遍历的节点空间复杂度就是 `O(n)`
![](../../Pictures/qrcode.jpg)