题解采用深度优先搜索(DFS)的方法来解决问题。首先遍历矩阵中的每个元素,当找到一个值为0的元素时,即水域的起始位置,从这个点开始进行DFS以探索整个相连的水域区域。DFS探索包括向八个方向扩展(上、下、左、右以及四个对角方向),并将访问过的水域标记为1以避免重复计算。每次调用DFS时,如果它是水域,则大小增加1,并递归计算所有相邻的水域大小,然后将结果累加。最终,每次从一个未标记的水域开始的DFS会得到一个完整池塘的大小,并将其添加到结果列表中。遍历完成后,将列表中的池塘大小进行排序并返回。
时间复杂度: O(m * n)
空间复杂度: O(m * n)
class Solution:
def pondSizes(self, land: List[List[int]]) -> List[int]:
res = [] # 存放所有池塘的大小
m = len(land) # 矩阵的行数
n = len(land[0]) # 矩阵的列数
def dfs(x, y):
# 边界条件检查
if x < 0 or x >= m or y < 0 or y >= n or land[x][y] != 0: return 0
land[x][y] = 1 # 标记当前水域已访问
# 递归调用8个方向并累加池塘大小,包括当前点
return dfs(x-1, y) + dfs(x+1, y) + dfs(x, y-1) + dfs(x, y+1) + dfs(x-1, y-1) + dfs(x-1, y+1) + dfs(x+1, y-1) + dfs(x+1, y+1) + 1
for i in range(m):
for j in range(n):
if land[i][j] != 0: continue # 只在水域起始位置开始DFS
res.append(dfs(i, j)) # 计算并收集当前池塘大小
res.sort() # 排序池塘大小
return res