1
1
## 1. 深度优先搜索简介
2
2
3
- > ** 深度优先搜索算法(Depth First Search)** :英文缩写为 DFS。 是一种用于搜索树或图结构的算法。所谓深度优先,就是说优先沿着一条路径走到底,直到无法继续深入时再回头 。
3
+ > ** 深度优先搜索算法(Depth First Search)** :英文缩写为 DFS, 是一种用于搜索树或图结构的算法。深度优先搜索算法采用了回溯思想,从起始节点开始,沿着一条路径尽可能深入地访问节点,直到无法继续前进时为止,然后回溯到上一个未访问的节点,继续深入搜索,直到完成整个搜索过程 。
4
4
5
- 深度优先搜索算法采用了回溯思想,该算法从起始点开始,沿着一条路径经可能深入地访问节点,直到无法继续前进时为止,,然后回溯到上一个未访问的节点,继续深入搜索,直到完成整个搜索过程 。
5
+ 深度优先搜索算法中所谓的深度优先,就是说优先沿着一条路径走到底,直到无法继续深入时再回头 。
6
6
7
7
在深度优先遍历的过程中,我们需要将当前遍历节点 $u$ 的相邻节点暂时存储起来,以便于在回退的时候可以继续访问它们。遍历到的节点顺序符合「后进先出」的特点,这正是「递归」和「堆栈」所遵循的规律,所以深度优先搜索可以通过「递归」或者「堆栈」来实现。
8
8
52
52
53
53
深度优先搜索算法可以通过递归来实现,以下是基于递归实现的深度优先搜索算法步骤:
54
54
55
- 1 . 定义 $graph$ 为存储无向图的嵌套数组变量,$visited$ 为标记访问节点的集合变量。$start $ 为当前遍历边的开始节点。定义 ` def dfs_recursive(graph, start , visited): ` 为递归实现的深度优先搜索方法。
55
+ 1 . 定义 $graph$ 为存储无向图的嵌套数组变量,$visited$ 为标记访问节点的集合变量。$u $ 为当前遍历边的开始节点。定义 ` def dfs_recursive(graph, u , visited): ` 为递归实现的深度优先搜索方法。
56
56
2 . 选择起始节点 $u$,并将其标记为已访问,即将节点 $u$ 放入 $visited$ 中(` visited.add(u) ` )。
57
57
3 . 检查当前节点 $u$ 是否为目标节点(看具体题目要求)。
58
58
4 . 如果当前节点 $u$ 是目标节点,则直接返回结果。
@@ -172,6 +172,8 @@ Solution().dfs_stack(graph, "A")
172
172
173
173
** 示例** :
174
174
175
+ - 示例 1:
176
+
175
177
``` python
176
178
输入:grid = [
177
179
[" 1" ," 1" ," 1" ," 1" ," 0" ],
@@ -180,8 +182,11 @@ Solution().dfs_stack(graph, "A")
180
182
[" 0" ," 0" ," 0" ," 0" ," 0" ]
181
183
]
182
184
输出:1
185
+ ```
183
186
187
+ - 示例 2:
184
188
189
+ ``` python
185
190
输入:grid = [
186
191
[" 1" ," 1" ," 0" ," 0" ," 0" ],
187
192
[" 1" ," 1" ," 0" ," 0" ," 0" ],
@@ -200,8 +205,8 @@ Solution().dfs_stack(graph, "A")
200
205
##### 思路 1:深度优先搜索
201
206
202
207
1 . 遍历 $grid$。
203
- 2 . 对于每一个字符为 ` '1' ` 的元素,遍历其上下左右四个方向,并将该字符置为 ` 0 ` ,保证下次不会被重复遍历。
204
- 3 . 如果超出边界,则返回 ` 0 ` 。
208
+ 2 . 对于每一个字符为 ` '1' ` 的元素,遍历其上下左右四个方向,并将该字符置为 ` '0' ` ,保证下次不会被重复遍历。
209
+ 3 . 如果超出边界,则返回 $0$ 。
205
210
4 . 对于 $(i, j)$ 位置的元素来说,递归遍历的位置就是 $(i - 1, j)$、$(i, j - 1)$、$(i + 1, j)$、$(i, j + 1)$ 四个方向。每次遍历到底,统计数记录一次。
206
211
5 . 最终统计出深度优先搜索的次数就是我们要求的岛屿数量。
207
212
@@ -285,7 +290,7 @@ class Solution:
285
290
286
291
##### 思路 1:深度优先搜索
287
292
288
- 1 . 使用哈希表 $visitedDict$ 来存储原图中被访问过的节点和克隆图中对应节点,键值对为 原图被访问过的节点:克隆图中对应节点。
293
+ 1 . 使用哈希表 $visitedDict$ 来存储原图中被访问过的节点和克隆图中对应节点,键值对为「 原图被访问过的节点:克隆图中对应节点」 。
289
294
2 . 从给定节点开始,以深度优先搜索的方式遍历原图。
290
295
1 . 如果当前节点被访问过,则返回隆图中对应节点。
291
296
2 . 如果当前节点没有被访问过,则创建一个新的节点,并保存在哈希表中。
0 commit comments