题目描述
思路解析动画文字版
关键两件事:① 每数一格就标记防重复;② 一座岛数完,用它的面积刷新最大值。
开始逐行逐列扫格子,蓝色是水、浅蓝是还没数到的陆地。碰到没数过的陆地就启动一次 DFS。
扫到 (0,0) 是没数过的陆地 → 发现第 1 座岛,从这里开始 DFS 把它整片数出来。
走到陆地 (0,0):数过它,当前这座岛面积 = 1,刷新了见过的最大面积 → 1。
走到陆地 (0,1):数过它,当前这座岛面积 = 2,刷新了见过的最大面积 → 2。
走到陆地 (1,0):数过它,当前这座岛面积 = 3,刷新了见过的最大面积 → 3。
第 1 座岛数完,面积 = 3。它是目前见过最大的,最大面积保持 3。归档(变绿),继续往后扫。
扫到 (0,3) 是没数过的陆地 → 发现第 2 座岛,从这里开始 DFS 把它整片数出来。
走到陆地 (0,3):数过它,当前这座岛面积 = 1(还没超过最大 3)。
走到陆地 (0,4):数过它,当前这座岛面积 = 2(还没超过最大 3)。
从 (0,4) 往下看 (1,4) 是水(0),不是陆地,这个方向不数。
走到陆地 (1,3):数过它,当前这座岛面积 = 3(还没超过最大 3)。
从 (1,3) 往右看 (1,4) 是水(0),不是陆地,这个方向不数。
走到陆地 (2,3):数过它,当前这座岛面积 = 4,刷新了见过的最大面积 → 4。
走到陆地 (2,2):数过它,当前这座岛面积 = 5,刷新了见过的最大面积 → 5。
走到陆地 (3,2):数过它,当前这座岛面积 = 6,刷新了见过的最大面积 → 6。
走到陆地 (3,1):数过它,当前这座岛面积 = 7,刷新了见过的最大面积 → 7。
走到陆地 (3,0):数过它,当前这座岛面积 = 8,刷新了见过的最大面积 → 8。
第 2 座岛数完,面积 = 8。它是目前见过最大的,最大面积保持 8。归档(变绿),继续往后扫。
扫到 (3,4) 是没数过的陆地 → 发现第 3 座岛,从这里开始 DFS 把它整片数出来。
走到陆地 (3,4):数过它,当前这座岛面积 = 1(还没超过最大 8)。
第 3 座岛数完,面积 = 1。没超过当前最大 8,最大面积不变。归档(变绿),继续往后扫。
全部格子扫完,一共 3 座岛,最大的那座面积 = 8,返回 8。
边界先想清,尤其「全水返回 0」别漏。
两个高频追问。
参考代码
def maxAreaOfIsland(grid): R, C = len(grid), len(grid[0]) def dfs(i, j): if i < 0 or i >= R or j < 0 or j >= C: return 0 if grid[i][j] != 1: return 0 # 水/已数过 grid[i][j] = 0 # 标记已数过 area = 1 for di, dj in ((-1,0),(0,1),(1,0),(0,-1)): area += dfs(i + di, j + dj) return area best = 0 for i in range(R): for j in range(C): if grid[i][j] == 1: best = max(best, dfs(i, j)) return best复杂度
- 时间:O(R·C),每个格子最多被访问一次(数过即标记)
- 空间:O(R·C),最坏情况整张图是一座岛,递归栈深度到格子总数
易错点
面试追问把动画讲成自己的话
追问为什么可以直接把陆地改成 0 当 visited,不另开一个 visited 矩阵?
追问DFS 和 BFS 都能做吗?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
太平洋大西洋水流问题
LeetCode 417 · 中等 · 沿着 图 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题