【题目1】最大1矩阵

3 篇文章 0 订阅
今天看到一道题目之后想起之前帮人补习算法的一道题目    【自己算法很水还帮人补习 orz   三天坑了他750】

下面那题是摘录leetcode题目的 电子书 里面13.4那题

今天看到的题目:
有一系列柱子

柱子高度分别为4 3 5 4 2 1

解法:
(1)矩阵必定是被某个高度限制列,例如长度为6也就是全部的长度,这个矩形就是被最后一个元素的高度限制住了
(2)我们枚举每一个高度,也就是枚举每一个元素,之后找出最长的长度  长乘以高就是面积

我们的关键就是找当前的高度a[i]的左右长度
动态规划:
如果当前a[i]>a[i-1],那么当前的高度不可以向左平移,左也就是0
如果当前a[i]<a[i-1],那么就要计算了,计算方法为,
过程中我们for a[i],
如果a[i]>a[i-1],L[i]=0,并且把元素a[i]压入一个栈,
如果a[i]<=a[i-1],我们把栈的元素弹出知道一个小于a[i]的数a[k],那么i-k就是a[i]可以向左平移的长度

同理计算R[]  之后过长找a[i]*(L[i]+1+R[i])   的最大值


我们用栈来查找,
例如:

L[1]=0
L[2]=0
L[3]=0
L[4]=0
L[5]:
到第五个元素的时候把第四个弹出之后继续第三个弹出,第二个小于第五个不弹出  那么L[5]=5-3


题目:给出一个矩阵,m*n的矩阵,矩阵只有0和1元素,要求最大的1矩阵   
【竟然是O(n*m)时间  差不多是扫面一遍的时间,实际扫面两遍】

  ------》
这个答案是8

跟上面有些重复的原理
(1)答案是一个矩形,那么我们可以证明,这个矩形的高是被一列的1元素限制的,例如样例就是被第二列第五列限制 不能再高一格,我们称为限制列  高度为H
(2)然后这个矩形的长度Length,限制列向左边平移的格子数量L(直到被一列高度跟限制列一样高但是里面有0元素的),限制列向右边平移的格子数量R(直到被一列高度跟限制列一样高但是里面有0元素的)Length=R+1+L
(3)当前限制列构造最大的矩形是(L+1+R)*H

上面是一个限制列的构造的矩阵的面试大小,每个限制列都有一个底,这个底就是矩阵的一个元素,我们枚举以每一个元素为底的限制列,计算该限制列的最大矩阵面积,这么多个(n*m)矩阵,其中最大的面积的矩阵就是最大1矩阵

如果我们把计算限制列高度限制列长度的时间降到O(1)  用动态规划实现  也就是动态规划得到H L R

代码之后附上,明天要早起,睡了先~








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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值