https://leetcode.com/problems/trapping-rain-water-ii/
其实这道题目我还没有总结好,但是隐隐地觉得有些模式在里面,就是如何将一个二维区域收缩起来。
大致思路就是:
- 现将外围的高度加入到PriorityQueue里面
- 不断地找到最小高度点(h, x, y), 因为我们已经将外围高度全部包含进来了,所以肯定能围到h高度。
- 观察(x,y)附近的点,如果有点(x2, y2)高度是h2<h的话,那么先将它填满到h高度
- 将(x2, y2)加入到PQ里面,但是以max(h, h2)的高度加入,这是因为如果h2<h的话,我们已经将它填满到了h高度。
class Solution:
def trapRainWater(self, heightMap: List[List[int]]) -> int:
n, m = len(heightMap), len(heightMap[0])
visited = set()
hp = []
for i in range(n):
hp.append((heightMap[i][0], i, 0))
hp.append((heightMap[i][m - 1], i, m - 1))
visited.add((i, 0))
visited.add((i, m - 1))
for i in range(m):
hp.append((heightMap[0][i], 0, i))
hp.append((heightMap[-1][i], n - 1, i))
visited.add((0, i))
visited.add((n - 1, i))
import heapq
heapq.heapify(hp)
ans = 0
while hp:
(h, x, y) = heapq.heappop(hp)
for dx, dy in ((-1, 0), (1, 0), (0, -1), (0, 1)):
x2, y2 = x + dx, y + dy
if 0 <= x2 < n and 0 <= y2 < m and (x2, y2) not in visited:
visited.add((x2, y2))
h2 = heightMap[x2][y2]
if h > h2:
ans += (h - h2)
heapq.heappush(hp, (max(h2, h), x2, y2))
return ans