Skip to content

Commit

Permalink
Update 0133. 克隆图.md
Browse files Browse the repository at this point in the history
  • Loading branch information
itcharge committed Sep 5, 2022
1 parent 7fe41c8 commit 0a35bb2
Showing 1 changed file with 46 additions and 4 deletions.
50 changes: 46 additions & 4 deletions Solutions/0133. 克隆图.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,19 +5,56 @@

## 题目大意

给定一个无向连通图中一个节点的引用
**描述**:以每个节点的邻接列表形式(二维列表)给定一个无向连通图,其中 `adjList[i]` 表示值为 `i + 1`的节点的邻接列表,`adjList[i][j]` 表示值为 `i + 1` 的节点与值为 `adjList[i][j]` 的节点有一条边

要求:返回该图的深拷贝。
**要求**:返回该图的深拷贝。

**说明**

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

**示例**

![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2020/02/01/133_clone_graph_question.png)

```Python
输入:adjList = [[2,4],[1,3],[2,4],[1,3]]
输出:[[2,4],[1,3],[2,4],[1,3]]
解释:
图中有 4 个节点。
节点 1 的值是 1,它有两个邻居:节点 24
节点 2 的值是 2,它有两个邻居:节点 13
节点 3 的值是 3,它有两个邻居:节点 24
节点 4 的值是 4,它有两个邻居:节点 13
```

![](https://assets.leetcode-cn.com/aliyun-lc-upload/uploads/2020/02/01/graph-1.png)

```Python
输入:adjList = [[2],[1]]
输出:[[2],[1]]
```

## 解题思路

所谓深拷贝,就是构建一张与原图结构、值均一样的图,但是所用的节点不再是原图节点的引用,即每个节点都要新建。

可以用深度优先搜索或者广度优先搜索来做。

以深度优先搜索为例,根据所给定的节点,以深度优先搜索的方式遍历图,并在遍历图的同时,进行新建节点,并构建新图。
### 思路 1:深度优先搜索

## 代码
1. 使用哈希表 `visitedDict` 来存储原图中被访问过的节点和克隆图中对应节点,键值对为 原图被访问过的节点:克隆图中对应节点。
2. 从给定节点开始,以深度优先搜索的方式遍历原图。
1. 如果当前节点被访问过,则返回隆图中对应节点。
2. 如果当前节点没有被访问过,则创建一个新的节点,并保存在哈希表中。
3. 遍历当前节点的邻接节点列表,递归调用当前节点的邻接节点,并将其放入克隆图中对应节点。
3. 递归结束,返回克隆节点。

### 思路 1:代码

```Python
class Solution:
Expand All @@ -39,3 +76,8 @@ class Solution:
return dfs(node)
```

### 思路 1:复杂度分析

- **时间复杂度**:$O(n)$。其中 $n$ 为图中节点数量。
- **空间复杂度**:$O(n)$。

0 comments on commit 0a35bb2

Please sign in to comment.