返回
岛屿包围术——LeetCode200 岛屿数量解题报告
后端
2023-10-15 06:04:39
在计算机科学中,LeetCode 200 题“岛屿数量”是一道经典的算法题,考验算法设计和编码能力。为了探索并解开这道谜题,我们将深入研究并查集、深度优先搜索和广度优先搜索等算法,并提供详细的示例代码。
-
并查集
- 是一种数据结构,用于解决动态连通性问题,其核心思想是使用一组树来表示元素之间的连通关系。
- 优点 :效率高,特别是当元素数量庞大时。
- 适用场景 :需要对大规模数据进行连通性查询和修改时。
-
深度优先搜索
- 一种沿着树或图的深度遍历算法,它沿着当前节点的子节点逐个深度遍历,直到无法继续深入。
- 优点 :内存消耗少,适合解决树形或图形问题。
- 适用场景 :需要对树或图进行深度搜索时。
-
广度优先搜索
- 一种沿着树或图的广度遍历算法,它先遍历当前节点的相邻节点,然后依次遍历这些节点的相邻节点,以此类推。
- 优点 :可以保证找到最短路径,适合解决最短路径问题。
- 适用场景 :需要对树或图进行广度搜索时。
针对LeetCode 200题,综合考虑算法效率和适用性,并查集是最佳选择 。
- 初始化
- 将二维网格中的每个元素视为一个独立的集合,每个集合只包含它自身。
- 遍历网格
- 对于每个元素,检查其相邻元素是否为陆地。
- 如果是陆地,则将该元素与相邻元素所在的集合合并。
- 统计岛屿数量
- 最后,统计集合的数量即可得到岛屿数量。
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方法来合并相邻的陆地元素。最后,统计集合的数量即可得到岛屿数量。
希望本文对您有所帮助。如果您有任何问题或建议,请随时留言。