题目描述
给你一个
m x n的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。
示例:
给出如下3x6的高度图:
[
[1,4,3,1,3,2],
[3,2,1,3,2,4],
[2,3,3,2,3,1]
]
返回4。
如上图所示,这是下雨前的高度图[[1,4,3,1,3,2],[3,2,1,3,2,4],[2,3,3,2,3,1]]的状态。
下雨后,雨水将会被存储在这些方块中。总的接雨水量是4。
提示:
1 <= m, n <= 110
0 <= heightMap[i][j] <= 20000
优先队列(堆)
在看这题的解法前可以去我之前讲解接雨水I的那篇博客看一下,那里也应用了这里的解法。
在那篇博客里我将双指针的本质做了讲解,即可以看作是从数组两端同时注水,然后从外到内,从低到高,直到左右两边的指针相遇即左右两边的水面相遇。
现在用矩阵取代之前的数组,从一维扩展到了二维,之前的数组两端映射为矩阵的最外围的四边,接雨水I从数组两端注水,那么在这里则是从矩阵最外围的四边同时注水,从外到内,从低到高直至淹没所有位置。
在接雨水I中可以用双指针指向数组两端,这里则没法为所有外围位置都分配一个指针,所以必须要用到接雨水I从双指针解法延伸出来的优先队列解法。和接雨水I中先将数组两端元素压入队列中类似,先把矩阵最外围四边的所有元素压入队列,然后依次弹出堆顶元素即新的水面值,依次访问上下左右与其相邻的位置,遇到比当前水面值低的就计算积水量,并将新遍历到的元素和新的水面值都压入队列中,重复这些操作直至队列为空,即所有位置都已经遍历过了,用visited数组记录所有遍历过的位置,防止重复计算。这里也用到了BFS广度优先搜索的思想。
整个过程就像是随着水面不断升高,水不断地从四周向中间漫延一样,最终将所有柱子淹没,完成遍历,此时将水源撤走,留下的水即是矩阵最终的积水量。
代码(Python)
class Solution:
def trapRainWater(self, heightMap: List[List
这篇博客探讨了如何使用优先队列(堆)和BFS广度优先搜索算法解决LeetCode上的接雨水II问题。通过分析二维矩阵的高度图,计算出下雨后能接住的最大雨水体积。文章提供了详细的解题思路和Python代码实现。


最低0.47元/天 解锁文章
&spm=1001.2101.3001.5002&articleId=117377525&d=1&t=3&u=a3e55cf38ab34d1ea0919a30f8c4c5b8)
1568

被折叠的 条评论
为什么被折叠?



