返回

岛屿包围术——LeetCode200 岛屿数量解题报告

后端

在计算机科学中,LeetCode 200 题“岛屿数量”是一道经典的算法题,考验算法设计和编码能力。为了探索并解开这道谜题,我们将深入研究并查集、深度优先搜索和广度优先搜索等算法,并提供详细的示例代码。

  1. 并查集

    • 是一种数据结构,用于解决动态连通性问题,其核心思想是使用一组树来表示元素之间的连通关系。
    • 优点 :效率高,特别是当元素数量庞大时。
    • 适用场景 :需要对大规模数据进行连通性查询和修改时。
  2. 深度优先搜索

    • 一种沿着树或图的深度遍历算法,它沿着当前节点的子节点逐个深度遍历,直到无法继续深入。
    • 优点 :内存消耗少,适合解决树形或图形问题。
    • 适用场景 :需要对树或图进行深度搜索时。
  3. 广度优先搜索

    • 一种沿着树或图的广度遍历算法,它先遍历当前节点的相邻节点,然后依次遍历这些节点的相邻节点,以此类推。
    • 优点 :可以保证找到最短路径,适合解决最短路径问题。
    • 适用场景 :需要对树或图进行广度搜索时。

针对LeetCode 200题,综合考虑算法效率和适用性,并查集是最佳选择

  1. 初始化
    • 将二维网格中的每个元素视为一个独立的集合,每个集合只包含它自身。
  2. 遍历网格
    • 对于每个元素,检查其相邻元素是否为陆地。
    • 如果是陆地,则将该元素与相邻元素所在的集合合并。
  3. 统计岛屿数量
    • 最后,统计集合的数量即可得到岛屿数量。
class UnionFind:
    def __init__(self, n):
        self.parent = [i for i in range(n)]
        self.size = [1 for _ in range(n)]

    def find(self, x):
        if self.parent[x] != x:
            self.parent[x] = self.find(self.parent[x])
        return self.parent[x]

    def union(self, x, y):
        px, py = self.find(x), self.find(y)
        if px != py:
            if self.size[px] < self.size[py]:
                self.parent[px] = py
                self.size[py] += self.size[px]
            else:
                self.parent[py] = px
                self.size[px] += self.size[py]

def num_islands(grid):
    if not grid:
        return 0
    m, n = len(grid), len(grid[0])
    uf = UnionFind(m * n)
    for i in range(m):
        for j in range(n):
            if grid[i][j] == '1':
                if i > 0 and grid[i - 1][j] == '1':
                    uf.union(i * n + j, (i - 1) * n + j)
                if j > 0 and grid[i][j - 1] == '1':
                    uf.union(i * n + j, i * n + j - 1)
    return sum(uf.size[i] > 0 for i in range(m * n))

grid = [
  ['1','1','1','1','0'],
  ['1','1','0','1','0'],
  ['1','1','0','0','0'],
  ['0','0','0','0','0']
]

print(num_islands(grid))  # 输出:1

通过并查集算法,我们可以高效地解决LeetCode 200题“岛屿数量”问题。我们使用UnionFind类来管理二维网格中的元素集合,并通过find和union方法来合并相邻的陆地元素。最后,统计集合的数量即可得到岛屿数量。

希望本文对您有所帮助。如果您有任何问题或建议,请随时留言。