给定一个矩阵,其值显示该位置的高度,找到最大的池来保持矩阵中的水。例如:
[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-17
,39-8
和39-31
是相等的to 22+31+8 = 61
是可以存储在给定池中的最大值,这是矩阵中最大的可能池。
如何找到最大的水池?
"最大"被定义为池中所有深度的最大总和。
你应该实现像:
这样的功能public int findBiggestPool(int[][] matrix)
问题类似于How do I compute the number of valleys in a sequence of numbers?,但这个问题是矩阵而不是数组
答案 0 :(得分:1)
无效但直接的方法
<强>解释强>:
<强>算法强>:
查找每个单元格的溢出级别:
查找池:
作业:
答案 1 :(得分:1)
将所有外部单元格标记为&#34;漏出&#34;
递缓地将泄漏细胞附近的所有细胞标记为泄漏,如果它们高于或高于泄漏细胞
之后,所有未标记的单元格都是可行池的一部分 - 构建所有互连池的集合(让我们称之为这些湖泊)。
湖水位是它接触的最低漏水池的高度。
湖泊的总体积是(水位 - 细胞高度)的所有正值的总和
计算所有湖泊体积并使用最大值。
这也表明了一个令人讨厌的测试用例 - 当最大的池包含一个岛时,确保你最终得到的任何算法都能正常工作。我可以想象那里的一些失败。