今天看到一道题目之后想起之前帮人补习算法的一道题目 【自己算法很水还帮人补习 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
代码之后附上,明天要早起,睡了先~