1. 问题背景与核心概念
岛屿数量问题是LeetCode上经典的图论题目(编号200),也是面试中频繁出现的算法考题。题目要求计算二维网格中岛屿的数量,其中'1'代表陆地,'0'代表水域。岛屿由水平或垂直相邻的陆地连接形成,且假设网格四周都被水域包围。
这个问题本质上是对连通分量(Connected Components)的计数,属于图的遍历算法应用。在实际工程中,类似的算法可用于图像处理中的连通区域分析、社交网络中的社群发现等场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法选择与复杂度分析
2.1 深度优先搜索(DFS)实现
DFS是解决岛屿问题的直观选择。当遇到陆地时,通过递归或栈的方式探索所有相连的陆地,并标记为已访问。以下是Python实现的核心代码:
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':
dfs(grid, i, j)
count += 1
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] = '0' # 标记为已访问
dfs(grid, i+1, j)
dfs(grid, i-1, j)
dfs(grid, i, j+1)
dfs(grid, i, j-1)
时间复杂度:O(M×N),其中M和N分别是网格的行数和列数。每个网格点最多被访问一次。
空间复杂度:O(M×N),最坏情况下整个网格都是陆地,递归深度达到M×N。
2.2 广度优先搜索(BFS)实现
BFS使用队列来实现,同样有效但避免了递归可能导致的
