https://leetcode.com/problems/trapping-rain-water-ii/
给定一个表示
在二维立面图中的每个单元,计算水的体积
下雨后能陷进去。
稍微增加一点是,如果有一个洞,整个平台是在空气中?它到底能储存多少?
虽然我可以查找孔周围的边界区域并计算那里浪费了多少水,但我只能定义矩形边界区域(情况1),但对于第二种情况,如何定位和计算该区域中的水:
如果我只是寻找由灰色线定义的边界区域组成的矩形区域,计算此处存储的水,然后从总数中减去,则存储在绿色区域中的水将被移除,而不应该被移除。更大的问题是,如果根本不存在呢?
或者有什么方法我遗漏了,任何和所有的建议都是受欢迎的。
最佳答案
这是对我有效的方法。
我看的是不同的细胞,而不是区域。
设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]))
在至少一个单元格值更改时再次重复。
关于algorithm - 用孔(0)捕获雨水ii(LeetCode),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55254798/