在方阵中,每个单元格为黑色或白色。设计一种算法来找到最大白色(整个子方格是白色)子方块。
O(n ^ 2)的解决方案: 从左到右扫描每列,对于每列中的每个单元格,扫描每一行以找到最大的白色子方块。
你有更好的解决方案吗?
感谢
答案 0 :(得分:0)
首先请注意,您的解决方案不是O(n^2)
,而是更像O(n^4)
,因为对于每个单元格,您需要查找最大可能大小为O(n^2)
的矩阵本身,总共为O(n^4)
。
然而,可以在O(n^2)
:
首先,定义2个辅助功能(实现为矩阵):
whitesLeft(x,y) = number of adjacent white cells on the same row to the left from x,y - exclusive of x,y
whitesUp(x,y) = number of adjacent white cells on the same column up from x,y - exclusive of x,y
现在,定义递归函数:
D(0,y) = 0 if (0,y) is black
1 otherwise
D(x,0) = 0 if (x,0) is black
1 otherwise
D(x,y) = 0 if x,y is black
min{ D(x-1,y-1), whitesLeft(x,y), whitesUp(x,y) } + 1 otherwise
我们的想法是使用D(x,y)
计算(x,y)
中结束的最大正方形(右下角)。通过查找左侧的最小单元格,向上的单元格以及以(x-1,y-1)
结尾的仅具有白色单元格的子矩阵来计算此正方形。
请注意D(x,y)
可以使用O(n^2)
中的D ynamic Programming进行有效计算,而计算辅助函数(矩阵)的预处理也是O(n^2)
。< / p>
完成后,发帖D
以查找D(x,y)
的最大值(x,y)
以获得结果 - 这也是O(n^2)
。