https://leetcode.com/problems/trapping-rain-water-ii/
给定一个m×n的正整数矩阵,表示高度 在2D高程图中的每个单位像元,计算其水量 可以在下雨后困住。
有一点补充是,如果其中有一个洞并且整个平台都在空中?它实际可以存储多少?
虽然我可以寻找孔周围的边界区域并计算浪费的水量,但我只能定义一个矩形边界区域(案例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]))
在至少一个单元格值更改时再次重复该操作。