您的位置:首页 > 其它

0 1矩阵内寻找最大m*m的全0矩阵块

2014-03-12 10:06 239 查看
http://blog.csdn.net/liql2007/article/details/9365383

在一个位图中找面积最大的白色矩形:给你一个NxN的黑白位图(0 1矩阵),找一个面积最大的全白色(全0)的矩形。注意了,是一个矩形,不是任意一个白色相连的区域。

以下想法挺巧妙的,利用找柱状图最大矩形的方法一行一行地查找最大矩形块:

这个题实际上是上题“从柱状图中找最大矩形”的变种。基本思路:以行为单位,扫描这行之上的每列有多少白色的点,并记录下来成类似于柱状图的数组,考虑前面的部分结果,这个可以做到O(n);然后对这个数组用上题的解法O(n)得到当前最大的矩形。所以整个算法的复杂度是O(n*n)。

如果最大矩形块应该是一个m*m的呢? 以上方法当然也适用,在判断最大矩形块的时候,最大的定义换成了最大m*m矩形块。

而我的想法是,对于每个点(i, j),计算从(0, 0) 到(i-1, j-1)整个矩形块中1的个数sum(i, j),这个是初始化;接下来对于每个值为0的点(i, j), 查看对角线上(假设为(ii, jj))的值是否符合sum(ii, jj) -
(sum(i, jj) + sum(ii, j)) + sum(i, j) 这个条件,如果符合,那么证明,(i, j)到(ii, jj)之间的块是没有非0的值,也就是一个大小为ii - i 的矩阵块,这个有点像是组合数学的容斥原理。当然,后面查找对角线的这步可以用二分查找来实现,那么整个算法的复杂度是O(n^2logn)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: