在0-1矩阵中找到1的最大面积是一个问题。在此问题中,有两种情况:
要测量的区域是正方形。这很简单,DP。
要测量的区域为矩形。我无法为此考虑最佳的解决方案。
例:
010101
101001
111101
110101
最大的矩形的面积为4(第3行,第5列,第3、4行另外一个)。我们还能得到所有这些矩形吗?
我将逐步介绍一些增加难度/降低运行时复杂度的解决方案。
首先,解决暴力问题。生成每个可能的矩形。您可以通过迭代r1≤r2和c1≤c2的每对点(r1,c1)(r2,c2)来完成此操作(可以使用4个for循环来完成)。如果矩形不包含0,则将面积与迄今为止找到的最大面积进行比较。这是O(R
^ 3C ^ 3)。
我们可以将有效的矩形检查加快到O(1)。我们通过执行DP来做到这一点,其中dp(r,c)在矩形((1,1),(r,c))中存储0的数目。
那么((r1,c1),(r2,c2))中的0数为
然后,可以通过nzeroes(r1,c1,r2,c2)== 0检查矩形是否有效。
为此,有一个使用简单的DP和堆栈的O(R ^ 2C)解决方案。DP通过找到一个单元格上方的1个单元格的数量直到下一个0来对每列工作。dp如下:
然后,您执行以下操作:
area = 0
for each row r:
stack = {}
stack.push((height=0, column=0))
for each column c:
height = dp(r, c)
c1 = c
while stack.top.height > height:
c1 = stack.top.column
stack.pop()
if stack.top.height != height:
stack.push((height=height, column=c1))
for item in stack:
a = (c - item.column + 1) * item.height
area = max(area, a)
也可以使用三个DP解决O(RC)中的问题:
三种重复关系是:
h(r,c)= h(r-1,c)+1否则
l(r,0)= 0
如果矩阵[r-1] [c] == 0,则l(r,c)= cp
l(r,c)= min(l(r − 1,c),c − p)否则
r(r,C + 1)= 0
如果矩阵[r-1] [c] == 0,则r(r,c)= pc
其中p是上一个0的列,因为我们从左至右填充l,从右至左填充r。
答案是:
之所以如此行事,是因为观察到最大的矩形在所有四个侧面上始终会接触到0(将边缘视为被0覆盖)。通过考虑所有顶部,左侧和右侧至少接触0的矩形,我们覆盖了所有候选矩形。生成每个可能的矩形。您可以通过迭代r1≤r2和c1≤c2的每对点(r1,c1)(r2,c2)来完成此操作(可以使用4个for循环来完成)。如果矩形不包含0,则将面积与迄今为止找到的最大面积进行比较。
注意:我是根据我在这里写下的答案改编以上内容的-
请参阅“ Ben的妈妈”部分。在该文章中,0为树。该文章也具有更好的格式。
我用直方图解决方案编写了这段代码,但用户将输入其矩阵,而不是在代码上输入矩阵。现在看看我做错了什么,除了柱状图的数学之外,一切似乎都正常。我做错了什么? 用户将输入行和列,然后一个接一个地输入矩阵中的每个值。然后代码将显示矩阵并计算所有1的最大大小矩形二进制子矩阵。
下面是二进制矩阵最大面积的代码。它有一个函数MAH()来返回直方图的最大面积。方法是将二进制矩阵(2d)分解为一维。然后将MAH()应用于每个一维数组并找到最大面积。 类解决方案{ 问题链接:二进制矩阵的最大面积 MAH()函数是正确的。仅maximalRectangle(char[][]矩阵)函数无法给出结果。有人能解释一下吗?? 这是另一个人发布的maximalRectangle(char[]
问题内容: 我试图计算二维二进制矩阵中的孤岛数量(一组相连的1组成一个孤岛)。 例: 在上面的矩阵中,有5个岛,分别是: 为了计算2D矩阵中的孤岛数量,我假设矩阵为图,然后使用DFS类型的算法对孤岛进行计数。 我一直在跟踪DFS(递归函数)调用的数量,因为在Graph中有很多组件。 下面是我为此目的编写的代码: 我传入参数的矩阵输出错误。我知道了,但是有集群。 我尝试调试任何逻辑错误的代码。但是我
我正在解决一个程序设计的挑战,在一个2D NxN矩阵中寻找最长的递增子序列的长度。在序列的每个元素中,行和列都必须增加(不需要连续)。本文用动态规划方法求解,但它是O(n^4),效率低。然而,在O(n^3)中有许多解。一种这样的解决办法是: 有人能解释一下它的工作原理或其他O(n^3)方法吗?我根本听不懂:(。
我有一个编码器BCH的输出矩阵(3,63),但这个矩阵是伽罗瓦域,我需要将这个伽罗瓦域转换为矩阵二进制,因为matlab将伽罗瓦域中的元素视为字符串,我需要将这些值视为二进制数。 我需要将代码列与000010进行比较,。。。对于开关情况或if,但代码矩阵行是伽罗瓦场格式。我的问题是,遵循matlab错误是开关表达式必须是标量或字符向量。
我有几个维度的多维矩阵,其中中的每个元素都是一个单独的传感器输入,是时间。我想做的是只分析中每个元素在上的峰值,因此我将得到一个的二维矩阵,其中只包含最大值。 我知道有很多方法可以获得单个整体最大值,但是有没有一种方法可以将它与逐个元素的操作相结合,比如,这样它就可以通过检查每个单独的元素? 如果你能给我任何帮助,我将感激不尽,因为我现在真的被困住了。提前谢谢!
我需要以正确的二维数组格式打印此内容。哎呀,这是错误的。需要从方法打印。我的输出似乎是一个无限循环。
我知道回溯会有所帮助,但如何呢?