题目描述
思路解析动画文字版
关键不是背模板,而是看懂为什么这题适合网格 DFS。
目标 · 最大的那座岛有几格:求最大岛屿面积——网格里相邻陆地连成一座岛,要找格子数最多的那座。办法:对每座岛 DFS 淹掉、边淹边数格子,记录见过的最大面积 best。
扫到 (0,0) · 启动 DFS,面积记 1:从左上角扫,碰到第一格陆地 (0,0)。启动 DFS:把它淹掉(标记已访问),本岛面积记 1。
向四方向扩展 · 淹 (0,1),面积 2:DFS 向上下左右找相邻陆地。(0,1) 是陆地,淹掉,本岛面积 + 1 = 2。
继续淹连通陆地 · 面积到 4:沿着连通的陆地一路淹:(1,0)、(1,1) 也是这座岛的。全部淹完,这座岛共 4 格。
第一座岛完成 · 更新 best = 4:DFS 返回,这座岛面积是 4。和已知最大比较:best 从 0 更新为 4。
继续扫 · 碰到第二座岛 (1,3),面积重置:接着往后扫,碰到新的陆地 (1,3)。这是另一座岛,本岛面积从 1 重新数(best 仍记着 4)。
第二座岛 = 2 · best 不变:这座岛只有 (1,3)、(2,3) 两格,面积 2。2 小于 4,best 保持 4 不变。
扫完整张网格 · 返回 best = 4:整张网格扫完,所有岛都数过了。最大岛屿面积 = best = 4。关键:DFS 数一座岛的面积,外层循环取所有岛的最大。
把这句话记住,下次遇到同类题,就能更快选出方向。
边界三连:边界三连:极端输入先过一遍。
几个高频追问,记住答法。
参考代码
class Solution: def maxAreaOfIsland(self, grid): m, n = len(grid), len(grid[0]) def dfs(r, c): if r < 0 or r >= m or c < 0 or c >= n or grid[r][c] == 0: return 0 grid[r][c] = 0 # 淹掉,避免重复数 return 1 + dfs(r+1,c) + dfs(r-1,c) + dfs(r,c+1) + dfs(r,c-1) best = 0 for r in range(m): for c in range(n): best = max(best, dfs(r, c)) # 每座岛取最大 return best复杂度
- 时间复杂度:O(mn),每个格子最多被访问一次(淹掉后不再进)
- 空间复杂度:O(mn),DFS 递归栈,最坏 O(m·n)
可套用的代码模板
网格 DFS 数面积的可迁移骨架:dfs 返回连通块大小(1 + 四方向递归),淹掉走过的格子防重复,外层对每个起点取最大。岛屿数量、被围绕区域都套这套。
def dfs(r, c): if 越界 or grid[r][c] != 目标: return 0 # 边界/非目标 → 贡献 0 grid[r][c] = 已访问标记 # 淹掉,避免重复 return 1 + dfs(r+1,c)+dfs(r-1,c)+dfs(r,c+1)+dfs(r,c-1)# 外层:for 每个格子: best = max(best, dfs(r,c))易错点
面试追问把动画讲成自己的话
追问和「岛屿数量 LC200」的区别?
追问为什么改 0 而不用 visited?
追问复杂度?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
太平洋大西洋水流问题
LeetCode 417 · 中等 · 沿着 图 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题