【问题标题】:Trapping rain water ii (LeetCode) with hole (0)用孔捕获雨水 ii (LeetCode) (0)
【发布时间】:2019-08-10 19:04:38
【问题描述】:

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

给定一个 m x n 正整数矩阵,表示高度 二维高程图中的每个单元格,计算它的水量 下雨后可以诱捕。

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

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

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

或者有什么我遗漏的方法吗,欢迎提出任何建议。

【问题讨论】:

  • 为什么要将自己限制在矩形区域?我将开始围绕局部最小值增长区域,直到区域边界超过矩阵边界。稍微相关:Maximally stable extremal regions.
  • 好吧,我正在使用相同的函数来计算由于洞而“应该”流失的水。这只能接受区域为矩形。(第二张图片)。另外,您将如何存储任意区域?感谢您的建议。

标签: algorithm graphics graph-algorithm


【解决方案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]))

“max”部分是为了防止数值小于石头部分。而“最小”部分是确保相邻细胞保持水。

对于边界,水位为零,所以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]))

在至少一个单元格值发生变化时再次重复。

【讨论】:

  • @HimanshuSurana 很好,至少它足以通过 leetcode 测试 :)
  • 我无法理解这样做的原因,请您详细说明一下。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-21
  • 2023-04-10
  • 1970-01-01
  • 2021-04-27
  • 1970-01-01
  • 2020-10-12
  • 2017-04-04
相关资源
最近更新 更多