返回

用 Python 解决 LeetCode 200 题:找出岛屿的个数

闲谈

在深度学习领域,我们常常会遇到各种各样的算法问题,其中 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

代码解析

  1. 初始化岛屿数量:首先,我们定义一个变量 num_islands 来记录岛屿的数量。
  2. 遍历网格:我们使用两个嵌套的循环来遍历整个网格。
  3. 深度优先搜索(DFS):当我们在网格中发现一个值为 1 的单元格时,我们调用 dfs 函数来标记所有相连的陆地单元格为已访问。
  4. 标记已访问:在 dfs 函数中,我们将当前单元格标记为 0,表示该单元格已被访问。然后,我们递归地调用 dfs 函数来访问当前单元格的上、下、左、右四个方向的单元格。

总结

通过上述步骤,我们可以有效地使用 Python 和 DFS 算法来解决 LeetCode 200 题。这个解决方案不仅清晰易懂,而且高效实用。希望这篇文章能帮助你在解决类似问题时更加得心应手。如果你有任何疑问或需要进一步的解释,请随时提问。