相似题目:01矩阵里找面积最大的全1方矩阵
解法:动态规划
if num[i][j] == 0:
dp[i][j] = 0
else:
dp[i][j] = max(dp[i-1][j], dp[i-1][j-1], dp[i-1][j-1]) + 1
本题:01矩阵里找面积最大的全1矩阵,不再限制于方阵
解法:动态规划
思路:转换成找面积最大的直方图问题,时间O(mn),但易超时
这样就转化成了找面积最大的直方图问题,参考这份链接:https://www.cnblogs.com/mickole/articles/3654280.html
两种方法,例如对于下图,求最大面积
方法一:暴力枚举:遍历每一个数字,计算其左右不低于他的长度,得到面积 ,并使用max一直保存,O(nn)
方法二:单调栈:
以H[i]为高的矩形向左右扩展,找到能够到达的最远距离,即找到左右边界第一个小于H[ i ]的位置, 实际上就是一道单调栈的问题,用一个栈来维护一个单调递增的序列,如果栈中的某个元素比当前的数值的小,那么该元素之后的元素肯定是用不到了,所以就可以直接丢出栈, 并将该值加入栈中,遍历一遍,用ans记录最大值即可
https://blog.youkuaiyun.com/qq_43328040/article/details/90735071
一个线性算法是用堆栈来保存当前可能的矩形(高度和起始位置)。从左到右扫描,对一个元素,如果
a)大于栈顶元素, push;
b)小于的话,pop所有的大于它的元素,计算面积,更新最大值。这时如果堆栈空,push一个新的元素,高度等于当前元素,起始位置为0;否则,push当前元素高度和栈顶的起始位置。
再仔细解释一下上述流程:
0.对于13223这个数组,首先对于空栈,我们压入第一个元素以及位置,stack=[(1,0)]
1.然后因为3大于栈顶,继续压入,stack=[(1,0), (3,1)]
2.接下来2小于栈顶,弹出栈顶并计算ans = 3*(2-1) = 3,然后压入(2,1),注意此时不是压入(2,2),stack=[(1,0), (2,1)]
3.当前2等于栈顶,stack=[(1,0), (2,1)]
4.3大于栈顶,继续压入,stack=[(1,0), (2,1), (3,4)]
5.全部元素入栈完毕,开始逐个元素pop并计算ans,首先pop(3,4),ans = 3*(5-4) = 3,stack=[(1,0), (212)]
5.pop(2,1),ans = 2*(5-1) = 8,stack=[(1,0)]
5.pop(1,0),ans = 1*(5-0) = 5,stack=[],算法结束,使用线性时间
https://www.cnblogs.com/mickole/articles/3654280.html
本文来自程序媛驿站,未经授权不得转载.
如有需要请公众号后台联系
(欢迎转发到朋友圈~)