面试题 16.19. 池塘大小-LeetCode
面试题 16.19. 池塘大小 - Pond Sizes
🎯 问题描述(来源于LeetCode)
描述:
给定一个 m x n 的整数矩阵 land,其中:
0表示池塘(水域)。- 正整数表示陆地。
池塘是八方向(上、下、左、右、以及对角线方向)连通的0区域。
请返回所有池塘的大小(即每个池塘中包含的0的数量),并将结果按从小到大排序。
说明:
- 八方向连通包括水平、垂直和对角线相邻。
- 池塘的边界由陆地(正整数)或网格边界限定。
示例:
- 示例 1:
1 | 输入: |
💻 解题思路
思路1:DFS 遍历八方向连通分量
算法步骤
-
初始化:
- 获取网格尺寸
m, n。 - 创建
visited二维数组,标记已访问的格子。 - 定义八方向偏移量:
[(-1,-1),(0,-1),(1,-1),(-1,0),(1,0),(-1,1),(0,1),(1,1)]。 - 结果列表
ans = []。
- 获取网格尺寸
-
定义 DFS 函数
dfs(i, j):- 返回当前池塘的大小(包含当前格子)。
- 标记
(i, j)为已访问。 - 初始化
size = 1。 - 遍历八个方向:新坐标
(di, dj),如果合法、未访问且land[di][dj] == 0,则递归调用dfs(di, dj)并将返回值累加到size。 - 返回
size。
-
遍历所有格子:
- 对于每个格子
(i, j),如果它是池塘(值为0)且未被访问,则调用dfs(i, j)得到池塘大小,加入ans。
- 对于每个格子
-
排序并返回:
- 对
ans从小到大排序,返回排序后的列表。
- 对
思路1:代码实现
1 | from typing import List |
思路1:📊 性能分析
- 时间复杂度:,每个格子最多访问一次,对每个访问的格子检查 8 个邻居。
- 空间复杂度:,
visited数组占用额外空间,递归栈深度最坏为池塘大小(可能接近 )。
思考
- 本题与 LeetCode 200([[岛屿数量]])的区别在于:本题是八方向连通,且统计的是
0区域的面积(大小),而岛屿数量是四方向且统计的是1的区域数量。 - 也可以用 BFS 实现,使用队列代替递归,避免深度过大导致栈溢出。
- 注意:题目要求结果按从小到大排序,因此需要对
ans排序后返回。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






