【编程题】【未知出处】01矩阵里找面积最大的全1矩阵

相似题目: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.csdn.net/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

 

本文来自程序媛驿站,未经授权不得转载.

如有需要请公众号后台联系

(欢迎转发到朋友圈~)

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值