返回
算法通关指南:LeetCode 695. 岛屿的最大面积
闲谈
2024-01-02 16:30:19
算法通关指南:LeetCode 695. 岛屿的最大面积
在算法学习的道路上,算法通关指南就像一盏明灯,指引着我们深入算法世界的奥秘。今天,我们将共同开启 LeetCode 695. 岛屿的最大面积 的解题之旅,探索两种经典算法的精妙之处:深度优先搜索 (DFS) 和广度优先搜索 (BFS)。
问题概述
给定一个包含 0 和 1 的二维网格,其中 1 代表陆地,0 代表水域。相邻的 1 构成一个岛屿。你的任务是找到网格中面积最大的岛屿并返回其面积。
解法一:深度优先搜索 (DFS)
深度优先搜索就像一个探险家,深入未知的领域,逐个探索相邻的单元格。它的基本思想是:
- 从一个未访问的陆地单元格出发,标记它为已访问。
- 递归地探索其四个相邻单元格(左、上、右、下)。
- 统计当前探索的陆地单元格数量,作为该岛屿的面积。
- 返回该岛屿的面积,并更新最大岛屿面积。
代码示例:
def maxAreaOfIsland(grid):
max_area = 0 # 最大岛屿面积
visited = [[False] * len(grid[0]) for _ in range(len(grid))] # 访问标记
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j] == 1 and not visited[i][j]:
max_area = max(max_area, dfs(grid, visited, i, j))
return max_area
def dfs(grid, visited, i, j):
if i < 0 or i >= len(grid) or j < 0 or j >= len(grid[0]) or grid[i][j] == 0 or visited[i][j]:
return 0
visited[i][j] = True # 标记当前单元格已访问
return 1 + dfs(grid, visited, i-1, j) + dfs(grid, visited, i+1, j) + dfs(grid, visited, i, j-1) + dfs(grid, visited, i, j+1)
解法二:广度优先搜索 (BFS)
广度优先搜索更像是一场蔓延的火势,从一个陆地单元格出发,逐步向四周扩散。它的基本思想是:
- 从一个未访问的陆地单元格出发,将其加入队列。
- 循环遍历队列,依次取出每个单元格,并将其标记为已访问。
- 探索其四个相邻单元格,如果相邻单元格为陆地且未访问,则将其加入队列。
- 统计当前 BFS 遍历的所有陆地单元格数量,作为该岛屿的面积。
- 返回该岛屿的面积,并更新最大岛屿面积。
代码示例:
def maxAreaOfIsland(grid):
max_area = 0 # 最大岛屿面积
visited = [[False] * len(grid[0]) for _ in range(len(grid))] # 访问标记
queue = [] # 队列
for i in range(len(grid)):
for j in range(len(grid[0])):
if grid[i][j] == 1 and not visited[i][j]:
queue.append((i, j))
visited[i][j] = True
island_area = 0 # 当前岛屿面积
while queue:
x, y = queue.pop(0)
island_area += 1
for dx, dy in [(0, 1), (0, -1), (-1, 0), (1, 0)]: # 四个方向
nx, ny = x + dx, y + dy
if 0 <= nx < len(grid) and 0 <= ny < len(grid[0]) and grid[nx][ny] == 1 and not visited[nx][ny]:
queue.append((nx, ny))
visited[nx][ny] = True
max_area = max(max_area, island_area)
return max_area
总结
DFS 和 BFS 都是解决「岛屿的最大面积」问题的经典算法,各有优缺点。DFS 递归深度探索,适用于树状或图状结构,而 BFS 层次遍历,适用于较浅的结构。在实际场景中,根据具体问题选择合适的算法至关重要。
常见问题解答
-
DFS 和 BFS 的时间复杂度是多少?
- DFS:O(mn),其中 m 和 n 是网格的大小。
- BFS:O(mn),其中 m 和 n 是网格的大小。
-
为什么在 DFS 中需要访问标记?
- 访问标记防止我们重复访问同一单元格,从而避免无限循环。
-
为什么在 BFS 中需要队列?
- 队列存储待探索的单元格,确保按顺序进行广度遍历。
-
如何处理网格中的多个岛屿?
- 在 DFS 或 BFS 中,只要遇到未访问的陆地单元格,就表示发现了新的岛屿,需要重新统计其面积。
-
这两种算法是否可以扩展到三维网格?
- 是的,DFS 和 BFS 可以扩展到三维网格,只需考虑三个方向即可:上、下、左、右、前、后。
结语
算法通关指南系列旨在为你提供清晰简洁的算法讲解,助你轻松掌握算法精髓。希望本篇指南能为你打开 LeetCode 695. 岛屿的最大面积 的大门,让你在算法探索之旅中不断突破自我!