所以我遇到了一个有趣的算法问题,我正在努力想出最有效的解决方案。因此有一个二维数组,数组中的每个方块都是红色、白色或蓝色的。我们想要计算数组中至少包含一个红色正方形的子矩形的数量,没有蓝色正方形,白色正方形无关紧要。做这件事最好的方法是什么?这看起来像是一个简单的问题陈述。显然,我们可以遍历所有可能的子网格并测试它们是否有效,但这是非常低效的。有什么帮助吗?谢谢。
发布于 2021-02-27 22:34:19
您需要一种避免重复项的方法;例如,您可以使用x0,y0,x1,y1
标识一个矩形。
open, valid = empty sets of rectangles
add all red squares to a set `open`
while not `open` empty,
take the first `open` rectangle
for each direction,
try to grow it 1 square in that direction
if growth possible (not outside matrix, not blue),
and result not in `valid` or `open`,
add to `open`
add it to `valid`
valid
的大小是您查找的计数。可能会更优化,但至少它看起来是正确的,并且应该比查找所有可能的矩形快得多,因为a)如果没有红色,它永远看不到矩形;b)一旦矩形包含蓝色,它就永远不会继续查找。
在大小为n的网格上的“查看所有可能的矩形”算法将必须查看~n^4
矩形(在信封的后面,因为有n^2
x0,y0
pairs和n^2
x1,y1
pairs);并且,对于每个矩形,检查是否有蓝色和红色(因此,O(n^5)
是一个低球估计;O(n^6)
可能更接近标记)。重要的是,无论红色和蓝色的分布如何,它都会有这样的成本。我的建议在有效结果较少的情况下具有更好的复杂性:如果没有红色,或者如果它们都被蓝色(棋盘图案)包围,则为O(n^2)
。在最坏的情况下,它的复杂度也较低,因为它只有在有效时才会增长--可能在定义为全red的O(n^4)
最坏情况下增长。
https://stackoverflow.com/questions/66403918
复制相似问题