407. 接雨水 II java BFS+优先队列

  1. 接雨水 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

思路

为了提高效率,采用“农村包围城市”的策略,从外面往里面进行计算。

者是因为,每个点都必须找到最外围的高度,否则无法确定它能接多少雨水。既然如此,为什么不从最外面开始呢?即,每一次我们都从外面最矮的开始,慢慢地往里面计算。
1

  1. 最外围开始,而最外围的方块无法承载雨水。
  2. 从最外围的高度中选择最矮的柱子,先对它的邻居进行处理。这是因为决定能够接多少雨水并不是由周围最高的柱子决定,而是由最矮的决定。
  3. 高度 4 是最矮的,于是对其做 BFS,它的邻居是高度为 2 的方块。
  4. 由于 2 小于 4,2 的位置能够接纳高度为 2 的雨水,于是这个位置上的高度就变成了 4。
  5. 还是从最矮的点出发,还是 4,它的邻居是 0,于是 0 所能接的雨水高度就是 4。
  6. 还是 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[][
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值