用孔(0)捕获雨水ii(LeetCode)

时间:2019-03-20 06:34:01

标签: algorithm graphics graph-algorithm

  

https://leetcode.com/problems/trapping-rain-water-ii/

     

给定一个m×n的正整数矩阵,表示高度   在2D高程图中的每个单位像元,计算其水量   可以在下雨后困住。

有一点补充是,如果其中有一个洞并且整个平台都在空中?它实际可以存储多少?

虽然我可以寻找孔周围的边界区域并计算浪费的水量,但我只能定义一个矩形边界区域(案例1),但是对于第二种情况,如何定位和计算该区域中的水:

[]

如果我只是寻找由灰线定义的边界区域组成的矩形区域,请计算此处存储的水,然后从总数中减去,将删除不应存储在绿色区域中的水。还有更大的问题,如果根本不存在该怎么办?

[]

或者我缺少任何方法,欢迎任何建议。

1 个答案:

答案 0 :(得分:0)

这是最适合我的方法。

我在看单独的单元,而不是区域。

a[i][j]为结合的石头(或其任何材料)和上面的水的总高度。

那么我们有:

a[i][j] = max(height[i][j], min(a[i+1][j], a[i][j+1], a[i-1][j], a[i][j-1]))

“最大”部分是为了防止该值小于石头部分。而“最小”部分是确保相邻单元格中保持水。

对于边界,水位是零,所以a[i][j] = height[i][j]。对于其他单元格,我们可以从一个很大的数字开始。

稍微说明一下:假设您确定知道相邻单元格的水位不能超过7(例如)。那么您当前单元格的水位也不能超过7:实际上没有任何东西可以阻止水流向相邻单元格的方向。

顺便说一句,如果您在一个单元格中有一个“洞”,则a [i] [j] = 0,因为那里不可能积水。

我们可以重复使用该公式作为“放松”,直到不再适用。当不再可能时,我们可以进行最终配置,只需要计算水量即可。

为使程序高效,我们可以自上而下进行申请:

a[i][j] = max(height[i][j], min(a[i-1][j], a[i][j-1]))

,然后从下到上应用:

a[i][j] = max(height[i][j], min(a[i+1][j], a[i][j+1]))

在至少一个单元格值更改时再次重复该操作。