求岛屿的最大面积。
未标记
考查重点:连通块搜索与面积统计。逐格扫描,未访陆地触发 DFS/BFS 并计连通块面积,取最大;四方向扩展并及时标记防重复
本题目录
参考答案
本答案基于相关资料,由 AI 辅助编写,供学习与面试准备参考。如有疏漏,欢迎反馈指正。
核心回答
把每个陆地格看成图节点,上下左右相邻的陆地之间连边。扫描网格,遇到未访问陆地就进行一次DFS,统计这个连通分量的格子数,维护最大值。每个格子至多入栈一次,总时间O(mn),额外空间最坏O(mn)。
这里按常见题意采用0/1矩形网格、四方向连通;对角线接触不算同一岛。下面用显式栈实现DFS,保留原网格不变,并处理空网格。
Python实现
def max_area_of_island(grid: list[list[int]]) -> int:
if not grid:
return 0
rows, cols = len(grid), len(grid[0])
if any(len(row) != cols for row in grid):
raise ValueError("grid必须为矩形")
visited = set()
best = 0
for r in range(rows):
for c in range(cols):
if grid[r][c] != 1 or (r, c) in visited:
continue
stack = [(r, c)]
visited.add((r, c))
area = 0
while stack:
x, y = stack.pop()
area += 1
for dx, dy in ((1, 0), (-1, 0), (0, 1), (0, -1)):
nx, ny = x + dx, y + dy
if (0 <= nx < rows and 0 <= ny < cols
and grid[nx][ny] == 1
and (nx, ny) not in visited):
visited.add((nx, ny))
stack.append((nx, ny))
best = max(best, area)
return best
为什么不会漏计或重复
从一个陆地出发,每次只沿合法四方向扩展,所以访问到的格子都属于同一岛;任何通过四方向路径连通的陆地,都能沿该路径逐步被发现,因此不会漏掉。格子在入栈时就加入visited,避免被不同邻居重复压入,出栈时恰好计数一次。
例如[[1,1,0],[0,1,0],[1,0,1]]中,左上角三个1相连,下面两个1各自独立,最大面积为3。即使右下角与中间格子对角相邻,也不能并入。
常见边界和追问
没有陆地返回0;只有一个陆地返回1;全为陆地时返回mn。细长岛屿可能使递归DFS达到很深层数,显式栈不依赖Python调用栈。
如果允许修改输入,也可将发现的1改成0作为访问标记,省去visited集合,但显式栈最坏仍为O(mn),不能因此称总额外空间O(1)。BFS和并查集同样可以求连通分量面积,单次静态网格遍历用DFS/BFS更直接;动态添加陆地时再考虑并查集。
参考资料
- 国内:Doocs:岛屿的最大面积:借鉴四连通面积统计与 DFS 复杂度,说明正文中遍历单个连通分量并维护最大面积的方法。
- 国内:代码随想录:岛屿的最大面积:对照起点和邻点的计数位置,避免同一陆地重复计数。
- 国内:Hello 算法:图的遍历:依据发现时标记 visited 的规则,说明正文中防止不同邻居重复入栈和重复计数的原因。
- 国外:LeetCode:Max Area of Island:依据只允许水平、竖直连通的题意,说明正文算例中对角线陆地不能并入同一岛的原因。
- 国外:Python Software Foundation:Data Structures:用列表append/pop实现显式栈,规避Python递归深度限制。
相关面经
2 篇收录题集
编程与数据结构算法
岛屿数量 岛屿问题: 「京东、字节Seed、字节跳动、拼多多、百度、美团、腾讯、阿里巴巴、阿里通义」

