1. 问题背景与核心概念
岛屿数量问题是LeetCode上经典的图论题目(编号200),也是面试中的高频考题。题目要求计算二维网格中岛屿的数量,其中'1'代表陆地,'0'代表水域。岛屿由水平或垂直方向上相邻的陆地组成,被水域完全包围。
这个问题的现实意义在于图像处理中的连通区域分析,比如卫星图像中的陆地识别、医学影像中的细胞团检测等。算法层面,它考察的是图的遍历能力,特别是深度优先搜索(DFS)和广度优先搜索(BFS)的应用。
关键理解:岛屿即连通分量(Connected Component),解题本质是统计矩阵中'1'的连通块数量。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解法思路与算法选择
2.1 暴力解法与优化方向
最直观的解法是遍历整个矩阵,遇到'1'时进行标记并统计。但这种方法时间复杂度高达O(n^4),因为每个点都可能触发全矩阵扫描。我们需要更聪明的标记方式。
2.2 深度优先搜索(DFS)实现
DFS是解决这类连通性问题的首选方案。当发现一个未被访问的'1'时,递归访问其上下左右的相邻节点,并标记为已访问。这样每个岛屿只会被计数一次。
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)
return count
def dfs(grid, i, j):
if i<0 or j<0 or i>=len(grid) or j>=len(grid[0]) or grid[i][j] != '1':
return
grid[i][j] = '#' # 标记已访问
dfs(grid, i+1, j)
dfs(grid, i-1, j)
dfs(grid, i, j+1)
dfs
