- 接雨水 II java BFS+优先队列
给你一个 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
思路
为了提高效率,采用“农村包围城市”的策略,从外面往里面进行计算。
者是因为,每个点都必须找到最外围的高度,否则无法确定它能接多少雨水。既然如此,为什么不从最外面开始呢?即,每一次我们都从外面最矮的开始,慢慢地往里面计算。
- 最外围开始,而最外围的方块无法承载雨水。
- 从最外围的高度中选择最矮的柱子,先对它的邻居进行处理。这是因为决定能够接多少雨水并不是由周围最高的柱子决定,而是由最矮的决定。
- 高度 4 是最矮的,于是对其做 BFS,它的邻居是高度为 2 的方块。
- 由于 2 小于 4,2 的位置能够接纳高度为 2 的雨水,于是这个位置上的高度就变成了 4。
- 还是从最矮的点出发,还是 4,它的邻居是 0,于是 0 所能接的雨水高度就是 4。
- 还是 4 是最矮,可以更新它周围的点在接了雨水后的高度。
那么,如何快速知道接下来哪个高度最矮呢?可以用优先队列来提高速度。
代码
public class Cell {
int row;
int col;
int height;
public Cell() {
}
public Cell(int row, int col, int height) {
this.row = row;
this.col = col;
this.height = height;
}
}
class Solution {
public int trapRainWater(int[][