我想取一个0和1的网格,然后到达网格中的所有矩形,它们共享一个共同的角落。
但是我没有找到具有最大面积的单个矩形,而是希望找到共享一个共同角落的所有矩形。如果我指定坐标(10,10),我想要所有可能的左下角为10,10的矩形。
有人可以帮助解释我如何调整我所链接的算法的实现来做我所描述的吗?
答案 0 :(得分:1)
我不确定如何针对这个问题调整给定的算法,但我有一个很好的方法来解决这个问题。
说,我们在(x1,y1)处给出了矩形的左下角。我们保持矩形数量(值为1并共享左下角)的数量和一个水平值,直到可以在y hval的值处找到矩形。现在,我们水平遍历到hval或者如果我们在路上找到0,因为在此点之外不能制作矩形。现在,我们将这个x作为新的hval。我们移动到下一行并且每次计算我们已经过的矩形数量时都这样做。
解决方案是O(n2)。由于我们使用了最多2 * num步,因此解的复杂性也受θ(num)的限制。
这个python代码示例可以提供更好的理解:
num = 0
hval = len(board)
i = 1
x1=1
y1=1
x2 = x1
while (y1 < len(board) and i > 0):
i = 0
while (board[y1][x2] == 1 and x2 < hval):
num += 1
x2 += 1
i += 1
else:
hval = x2
y1 += 1
x2 = x1
print(num)
答案 1 :(得分:1)
您不希望或需要我的链接答案。一个简单的方法是首先计算输入矩阵M [] []的"integral image" I [] [] - 即矩阵I [] [],其(x,y)条目是输入矩阵中(x,y)左下方和所有条目的总和。这使您可以使用I [x2] [y2] - I [x1-1] [y2] - I [x2] [y1]在恒定时间内轻松计算任何给定矩形(x1,y1,x2,y2)中的1的数量-1] + I [x1-1] [y1-1],if(x1,y1)是左下角,(x2,y2)是右上角。 I [] []可以在一次性O(n ^ 2)预处理步骤中计算。
对于给定的左下角(x1,y1),您可以使用一对嵌套循环以递增顺序循环遍历所有宽度w和高度h,测试矩形中的1的数量(x1, y1,x1 + w,y2 + h)是全1矩形中应该存在的1的数量 - 即(b + 1)*(h + 1)。一旦这不能成功,就提前退出该循环(因为如果某个矩形不是全1矩形,那么很明显,那么包含它的矩形也不是)。
对于n * n矩形,该算法当然是O(n ^ 2) - 时间,但是没有避免这种最坏情况(考虑每个条目为1的输入矩阵)。