题目描述
网格中 1 表示陆地,求最大岛屿面积。
grid = 含多块陆地
输出 = 最大连通块面积
思路解析
关键不是背模板,而是看懂为什么这题适合网格 DFS。
1. 扫描到第一块陆地:扫描到第一块陆地
2. 启动 DFS,面积从 1 开始:启动 DFS,面积从 1 开始
3. 向右/下扩展相邻陆地:向右/下扩展相邻陆地
4. 每访问一格就标记 visited:每访问一格就标记 visited
5. 碰到水或边界就返回 0:碰到水或边界就返回 0
6. 这座岛 DFS 结束得到面积:这座岛 DFS 结束得到面积
7. 用 best 记录最大面积:用 best 记录最大面积
8. 扫完整张网格返回 best:扫完整张网格返回 best
把这句话记住,下次遇到同类题,就能更快选出方向。
用一个小问题检查自己是不是真的懂了。
参考代码(Python)
Python
1class Solution:
2 def maxAreaOfIsland(self, grid):
3 m, n = len(grid), len(grid[0])
4 def dfs(r, c):
5 if r < 0 or r >= m or c < 0 or c >= n or grid[r][c] == 0:
6 return 0
7 grid[r][c] = 0
8 return 1 + dfs(r+1,c) + dfs(r-1,c) + dfs(r,c+1) + dfs(r,c-1)
9 best = 0
10 for r in range(m):
11 for c in range(n):
12 best = max(best, dfs(r,c))
13 return best复杂度分析
- 时间复杂度:O(mn) —— 每个核心状态按算法要求处理固定次数
- 空间复杂度:O(mn) —— 只保存必要的辅助结构或递归栈
套路模板
模板不是死背,而是提醒你写代码前先把状态、转移和边界排好。
Python
1# 网格 DFS 通用检查表
2# 1. 定义状态/指针/容器
3# 2. 每轮只做一个清晰动作
4# 3. 更新答案并处理边界易错点
- 错误写法:数完一座岛不标记 → 正确写法:DFS 时要把访问过的陆地淹掉(否则会重复统计)
- 错误写法:只按样例推代码 → 正确写法:先写清状态含义和边界条件(样例太少,隐藏用例专打边界)
- 错误写法:变量名和动画不一致 → 正确写法:代码变量沿用动画里的核心名字(学习时最怕脑内维护两套概念)
以上文字与上方动画完全同一思路:先看动画建立直觉 → 读文字巩固 → 关掉页面自己默写一遍代码,能写出来才算真的掌握。