求岛屿的最大面积。

考查重点:连通块搜索与面积统计。逐格扫描,未访陆地触发 DFS/BFS 并计连通块面积,取最大;四方向扩展并及时标记防重复

本题目录

参考答案

核心回答

把每个陆地格看成图节点,上下左右相邻的陆地之间连边。扫描网格,遇到未访问陆地就进行一次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更直接;动态添加陆地时再考虑并查集。

参考资料

相关面经

2 篇

腾讯

后端开发工程师(AI 应用)
实习
查看原面经 →
手撕代码:比较简单的岛屿最大面积dfs

字节跳动

Agent 开发
暑期实习一面
查看原面经 →
岛屿最大面积

收录题集

1 个来源,共1 份题集

编程与数据结构算法

阿东玩 AI · AgentGuide · 1 条原题

查看题集 →

相关题目

4 题