返回
用 Python 解决 LeetCode 200 题:找出岛屿的个数
闲谈
2024-02-15 06:45:14
在深度学习领域,我们常常会遇到各种各样的算法问题,其中 LeetCode 200 题就是一道经典的图论问题,考察的是我们对深度优先搜索(DFS)算法的理解和应用能力。今天,我将带领大家一起用 Python 来解决这个问题,并深入探讨其中的细节和技巧。
问题描述
LeetCode 200 题的目标是统计给定二维网格中岛屿的数量。岛屿由值为 1 的单元格组成,且被水(值为 0)包围。你可以通过递归的方式来解决这个问题,具体来说,就是从一个岛屿出发,将所有相连的岛屿都标记为已访问,直到没有新的岛屿可以访问为止。
分析原因
为了解决这个问题,我们需要使用深度优先搜索(DFS)算法。DFS 算法是一种用于遍历或搜索树或图的算法。这个算法会尽可能深地搜索图的分支。当节点 v 的所在边都已被探寻过,搜索将回溯到发现节点 v 的节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。
解决方案
下面是一个使用 Python 实现的解决方案,包括详细的代码示例和操作步骤。
Python 代码实现
def num_islands(grid):
"""
统计二维网格中的岛屿数量。
Args:
grid: 二维网格,每个元素为 0 或 1。0 表示水域,1 表示陆地。
Returns:
岛屿数量。
"""
if not grid:
return 0
num_islands = 0
rows, cols = len(grid), len(grid[0])
def dfs(i, j):
if i < 0 or i >= rows or j < 0 or j >= cols or grid[i][j] == '0':
return
grid[i][j] = '0' # 标记为已访问
dfs(i - 1, j) # 上
dfs(i + 1, j) # 下
dfs(i, j - 1) # 左
dfs(i, j + 1) # 右
for i in range(rows):
for j in range(cols):
if grid[i][j] == '1':
dfs(i, j)
num_islands += 1
return num_islands
# 测试用例
grid1 = [
["1", "1", "1", "1", "0"],
["1", "1", "0", "1", "0"],
["1", "1", "0", "0", "0"],
["0", "0", "0", "0", "0"],
]
print(num_islands(grid1)) # 预期输出:1
grid2 = [
["1", "1", "0", "0", "0"],
["1", "1", "0", "0", "0"],
["0", "0", "1", "0", "0"],
["0", "0", "0", "1", "1"],
]
print(num_islands(grid2)) # 预期输出:3
代码解析
- 初始化岛屿数量:首先,我们定义一个变量
num_islands
来记录岛屿的数量。 - 遍历网格:我们使用两个嵌套的循环来遍历整个网格。
- 深度优先搜索(DFS):当我们在网格中发现一个值为 1 的单元格时,我们调用
dfs
函数来标记所有相连的陆地单元格为已访问。 - 标记已访问:在
dfs
函数中,我们将当前单元格标记为 0,表示该单元格已被访问。然后,我们递归地调用dfs
函数来访问当前单元格的上、下、左、右四个方向的单元格。
总结
通过上述步骤,我们可以有效地使用 Python 和 DFS 算法来解决 LeetCode 200 题。这个解决方案不仅清晰易懂,而且高效实用。希望这篇文章能帮助你在解决类似问题时更加得心应手。如果你有任何疑问或需要进一步的解释,请随时提问。