深度/广度优先搜索
#1 深度优先搜索(DFS)
Depth-First-Search
步骤 : 不到尽头不回头
- 从 1 开始,先找到其中一个相连的,2 被找到了
- 然后直接开始从 2 开始搜索,3 被找到了
- 然后从 3 开始搜索,4 被找到了
- 然后从 4 开始搜索,5 被找到了
- 然后从 5 开始搜索,忽略已经找到的所以啥都没找到
- 然后没路可走了,回到前面去再走另一条路
- 从 4 开始,6 被找到了,然后又没路可走了
- 然后再回去前面 4,然后没路了
- 回去前面 3,然后一直这样
1-2-3-4-5-6
#2 广度优先搜索(BFS)
Breadth-First-Search
步骤 :
- 从 1 开始进行搜索的话
- 先搜索所有和 1 相连的,也就是 2 和 5 被找到了
- 然后再从 2 开始搜索和他相连的,也就是 3 被找到了
- 然后从 5 搜,也就是 4 被找到了
- 然后从 3 开始搜索,4 被找到了,但是 4 之前已经被 5 找到了,所以忽略掉就行
- 然后 3 开始搜索,忽略 4 所以啥都没搜到,然后从 4 开始,6 被找到了
1-2-5-3-4-6
#3 算法题
#3.1 岛屿的最大面积
LeetCode :
https://leetcode-cn.com/problems/max-area-of-island/
题目 :
给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地)构成的组合。你可以假设二维矩阵的四个边缘都被水包围着。
找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为0。)
示例1 :
[[0,0,1,0,0,0,0,1,0,0,0,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0],
[0,1,1,0,1,0,0,0,0,0,0,0,0],
[0,1,0,0,1,1,0,0,1,0,1,0,0],
[0,1,0,0,1,1,0,0,1,1,1,0,0],
[0,0,0,0,0,0,0,0,0,0,1,0,0],
[0,0,0,0,0,0,0,1,1,1,0,0,0],
[0,0,0,0,0,0,0,1,1,0,0,0,0]]
对于上面这个给定矩阵应返回 6。
题目解读 :
- 每个元素,只能关联东南西北四个方向
- 在所给的二维矩阵中,找到由"1"相连的数量最多
思路 :
- 首先遍历每一个元素为 “1” 的点, 记为a
- 然后根据点a, 东南西北四个方向, 找到为 “1” 的点
- 递归a附近四个方向点, 的四个方向 (深度优先搜索)
代码 :
class Solution:
def maxAreaOfIsland(self, grid: List[List[int]]) -> int:
ret = 0 # 最大面积
for row, x in enumerate(grid):
for col, y in enumerate(x):
if grid[row][col] != 0: # 只有当元素为 "1" 时, 才使用深度优先搜索
ret = max(ret, self.dfs(grid,row,col)) # 每次DFS后, 与之前的最大面积相比, 取最大值
return ret
def dfs(self, grid, x, y): # 深度优先遍历
if x<0 or y<0 or x>=len(grid) or y>=len(grid[0]): # 越界 -> 返回 0
return 0
if grid[x][y] == 0: # 不是陆地 -> 返回 0
return 0
grid[x][y] = 0 # 被查询过得点, 标记 0
return self.dfs(grid,x,y+1) + self.dfs(grid,x,y-1) + self.dfs(grid,x+1,y) + self.dfs(grid,x-1,y) + 1 # (x,y)的四个方向 (x,y+1) (x,y-1) (x+1,y) (x-1,y), 每个方向调用DFS