class Solution:
def trapRainWater(self, heightMap) -> int:
m = len(heightMap)
n = len(heightMap[0])
if m < 2:
return 0
res = 0
for i in range(1, m-1):
for j in range(1, n-1):
# 找左右的最高点
a,b = 0, 0
for x in range(i-1, -1, -1):
a = max(a, heightMap[x][j])
for x in range(i+1, m):
b = max(b, heightMap[x][j])
c,d = 0,0
for y in range(j-1, -1, -1):
c = max(c, heightMap[i][y])
for y in range(j+1, n):
d = max(d, heightMap[i][y])
height = min(a,b,c,d)
if height > heightMap[i][j]: #周围比(i,j)高才能接到水
res += (height-heightMap[i][j])
return res
class Solution:
def trapRainWater(self, heightMap: List[List[int]]) -> int:
if len(heightMap) < 2 or len(heightMap[0]) < 2:
return 0
m, n = len(heightMap), len(heightMap[0])
visited = [[0 for _ in range(n)] for _ in range(m)]
pq = []
for i in range(m): #边缘全部入堆
for j in range(n):
if i == 0 or i == m - 1 or j == 0 or j == n - 1:
# 避免重复访问
visited[i][j] = 1
# 以元组(高度、坐标)入堆
heapq.heappush(pq, (heightMap[i][j], i * n + j))
res = 0
dirs = [-1, 0, 1, 0, -1] #辅助数组,在下文4次循环中,巧妙实现访问上下左右四个方向
while pq:
#分别从堆中取出高度和坐标
height, position = heapq.heappop(pq)
for k in range(4):
#坐标转换为二维
nx, ny = position // n + dirs[k], position % n + dirs[k + 1]
if nx >= 0 and nx < m and ny >= 0 and ny < n and visited[nx][ny] == 0:
if height > heightMap[nx][ny]:
res += height - heightMap[nx][ny]
visited[nx][ny] = 1
heapq.heappush(pq, (max(height, heightMap[nx][ny]), nx * n + ny))
return res