为了更好的阅读体检,可以查看我的算法学习网
在线评测链接:P1322
题目内容
01 01 01矩阵是计算机领域常用的矩阵,小 C C C喜欢在 01 01 01矩阵中寻找全 1 1 1的子矩阵,请你完成程序,可以求得一个矩阵中最大全 1 1 1子矩阵,并输出面积最大的全 1 1 1子矩阵中包含 1 1 1的个数。
输入
单组测试样例,第一行包含两个字母 m n m n mn,分别表示矩阵的行和列,接下来 m m m行每行 n n n个用空格分离的数字,表示 01 01 01矩阵中的元素。
输出
输出包括一个数字,表示面积最大全 1 1 1子矩阵中 1 1 1的个数。
样例
输入
5 3
1 0 1
1 1 0
0 1 1
1 0 1
1 1 1
输出
3
提示
矩阵仅包含
0
0
0和
1
1
1,数据保证(
1
≤
m
,
n
≤
500
1\leq m, n \leq 500
1≤m,n≤500).
思路:前缀和+单调栈
最暴力的做法
枚举矩阵的长和宽,然后枚举矩阵的左上角,这样计算出这个矩阵内 1 1 1 的数量是否等于矩阵的长×宽。枚举长和宽,然后枚举矩阵左上角,总时间复杂度为 O ( n 2 m 2 ) O(n^2m^2) O(n2m2),至于计算矩阵内 1 1 1 的数量,可以通过预处理二维前缀和,然后 O ( 1 ) O(1) O(1) 计算得到。
简化问题
如果将问题转换为一个一维的问题,即给定一个长度为 m m m 的数组 h h h,第 i i i 个柱子的高度为 h i h_i hi ,宽度为 1 1 1 ,求这 m m m 个柱子可以勾勒出的矩形的最大面积。这是道LeetCode原题 84. 柱状图中最大的矩形 。
此时我们可以枚举以每个柱子为最低高度,找到第 i i i 个柱子左边第一个比其高度低的柱子 l l l ,找到的 j j j 个柱子右边比其高度低的柱子 r r r 。即 l < i , h l < h i l < i, h_l < h_i l<i,hl<hi 且 r > i , h r > h i r > i, h_r>h_i r>i,hr>hi。这样以第 i i i 个柱子高度为矩形高度的宽度为 r − l − 1 r-l-1 r−l−1 。面积为 ( r − l − 1 ) × h i (r-l-1)\times h_i (r−l−1)×hi。
时间复杂度为: O ( m 2 ) O(m^2) O(m2)
完整思路以及代码见网站内部(文章顶部):塔子哥的文字题解