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)。
在一个位图中找面积最大的白色矩形:给你一个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)。
相关文章推荐
- 动态规划——寻找子矩阵最大和
- 动态规划——寻找子矩阵最大和
- 动态规划——寻找子矩阵最大和
- 在矩阵中寻找最大正方形连续区域
- HDU 2236 矩阵不同行列寻找 最小最大数的差值 最小 二分匹配+二分枚举区间
- 动态规划——寻找子矩阵最大和
- uva1330 在一个大的矩阵中寻找面积最大的子矩阵
- 经典矩阵dp寻找递增最大长度
- 动态规划——寻找子矩阵最大和
- 动态规划——寻找子矩阵最大和
- 在O(n^2)内寻找矩阵A中 A(c,d) - A(a,b) 的最大值, c > a 且 d > b.
- 经典面试题--寻找01矩阵中最大的1矩形(POJ 3494)
- 动态规划——寻找子矩阵最大和
- 动态规划——寻找子矩阵最大和
- 动态规划——寻找子矩阵最大和
- 动态规划——寻找子矩阵最大和
- 动态规划——寻找子矩阵最大和
- 寻找01矩阵中最大的子矩阵 Maximal Rectangle
- 动态规划——寻找子矩阵最大和
- 动态规划——寻找子矩阵最大和