最大的游泳池举行水

时间:2014-11-06 04:10:04

标签: algorithm

给定一个矩阵,其值显示该位置的高度,找到最大的池来保持矩阵中的水。例如:

[0,1,0]
[1,0,1]
[0,1,0]

这可以在中心保持1,因为左上,下,左和右的值比中心值高一。

[0,2,0]
[2,0,2]
[0,2,0]

可以在中心举行2,

[0,2,0]
[2,0,2]
[0,1,0]

只能容纳一个。

另一个例子是

形式的矩阵
[0,2,2,0]
[2,0,1,2]
[0,2,2,0]

在这种情况下,最大的池大小 3 ,因为两个单元[0,1]可以分别存储最多[2,1],因此它不会泄漏通过周围的2单元格,这两个单元格的总和 3

您可以假设矩阵是任意 NxM 矩阵

如果输入是

[1,  2,  78, 39, 20]
[4,  66, 17, 8,  55]
[35, 42, 78, 31, 64]
[34, 64, 24, 55, 21]

结果是61,因为17,8,31都可以加起来而不会泄漏。

你可以从39减去17 8 31,因为该区域周围的所有其他值仍然大于或等于39.只是图像矩阵是一个地图,所有数字都是ma的高度。如果您发现该区域的周围环境较低,您可以用水填充某些区域。

另一种解释方法是,矩阵中的 N N 相邻的索引元素,此示例中最大的池由相邻的[17,8,31]的数字,因为如果你选择了 39 附近的最小值,那么39-1739-839-31是相等的to 22+31+8 = 61是可以存储在给定池中的最大值,这是矩阵中最大的可能池。

如何找到最大的水池?

"最大"被定义为池中所有深度的最大总和。

你应该实现像:

这样的功能
public int findBiggestPool(int[][] matrix)

问题类似于How do I compute the number of valleys in a sequence of numbers?,但这个问题是矩阵而不是数组

2 个答案:

答案 0 :(得分:1)

无效但直接的方法

<强>解释

  • 等级 - 水的高度
  • 溢出级别 - 单元格中可包含的最大级别
  • 深度 - 溢出级别减去单元格的值

<强>算法

查找每个单元格的溢出级别:

  1. 创建一个用最大值填充的关卡矩阵
  2. 将边框单元格的级别设置为其值
  3. 对于每个单元格,将其级别设置为邻居的最低级别但不低于其值
  4. 重复3直到稳定
  5. 查找池:

    1. 取一个未标记的单元格,将池体积设置为其深度
    2. 递归收集相同级别和正深度的所有未标记的相邻单元格,将其深度添加到卷并标记它们
    3. 比较池容量与之前的卷头,请记住当前是否更大
    4. 如果有未标记的单元格转到1
    5. 作业:

      • 重读群集分析书籍
      • 删除递归
      • 合并步骤
      • 重用缓冲区

答案 1 :(得分:1)

将所有外部单元格标记为&#34;漏出&#34;

递缓地将泄漏细胞附近的所有细胞标记为泄漏,如果它们高于或高于泄漏细胞

之后,所有未标记的单元格都是可行池的一部分 - 构建所有互连池的集合(让我们称之为这些湖泊)。

湖水位是它接触的最低漏水池的高度。

湖泊的总体积是(水位 - 细胞高度)的所有正值的总和

计算所有湖泊体积并使用最大值。

这也表明了一个令人讨厌的测试用例 - 当最大的池包含一个岛时,确保你最终得到的任何算法都能正常工作。我可以想象那里的一些失败。