1. 问题描述与核心概念
这道题目要求我们计算一个由'1'(陆地)和'0'(水)组成的二维网格中岛屿的数量。岛屿被定义为被水包围的、由相邻陆地组成的区域,相邻指的是水平或垂直方向上相连的陆地。
举个例子,给定以下网格:
code复制[
['1','1','0','0','0'],
['1','1','0','0','0'],
['0','0','1','0','0'],
['0','0','0','1','1']
]
这个网格中有3个岛屿:左上角的4个'1'组成一个岛屿,中间的单个'1'是一个岛屿,右下角的两个'1'组成第三个岛屿。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解题思路分析
2.1 问题分解
解决这个问题的关键在于如何有效地遍历网格并识别出相连的'1'组成的岛屿。我们需要考虑以下几点:
- 如何遍历整个网格?
- 遇到'1'时如何处理?
- 如何标记已经访问过的'1',避免重复计数?
- 如何探索与当前'1'相连的所有'1'?
2.2 算法选择
这个问题典型的解法是使用深度优先搜索(DFS)或广度优先搜索(BFS)。两种方法都能有效地探索相连的陆地:
- DFS:从一个'1'出发,递归地探索其上下左右的相邻格子
- BFS:使用队列来存储待探索的相邻格子
此外,还可以使用并查集(Union-Find)数据结构来解决,但实现起来相对复杂。
3. DFS解法详解
3.1 基本实现
DFS是最直观的解法。当我们遇到一个'1'时,就从这个位置开始进行DFS,将所有相连的'1'都标记为已访问(可以原地修改为'0'),这样就不会重复计数。
python复制def numIslands(grid):
if not grid:
return 0
count = 0
rows, cols = len(grid), len(grid[0])
for i in range(rows):
for j in range(cols):
if grid[i][j] == '1':
count += 1
dfs(grid, i, j,
