题目如下:
给出的n个非负整数表示每个直方图的高度,每个直方图的宽均为1,在直方图中找到最大的矩形面积。
以上直方图宽为1,高度为[2,1,5,6,2,3]。
最大矩形面积如图阴影部分所示,含有10单位
样例
给出 height = [2,1,5,6,2,3],返回 10
解题时产生两个思路:
1:每个柱子都按当前位置左右遍历,左右面积加起来就是解。但复杂度相对较高。
2:看这题目,发现很眼熟,其实在之前得博文中已有解题方法,地址在这 Arithmetic problem | 找二维矩阵权值为1的最大矩形面积,但由于当时是映射出来得,所以也就简化了解析步骤。此思路也算是由思路一演化而来,把递增的直方图归为一体缓存,从而把直方图特化成拥有最高点的“山峰”,那么缓存里的直方图所包含的最大矩形面积也就不会超过缓存的两个极端。从而不用左右横扫多次。
思路二实现代码如下:
#define max(a,b) a>b?a:b
void Method(vector<int> &t)
{
int j,l,r,u,m=0;
t.push_back(0);
stack<int> s;
for(j=0; j<(int)t.size(); ++j)
{
while(!s.empty()&&t[s.top()]>t[j])
{
u=s.top(),s.pop();
l=(s.empty()?u+1:u-s.top())*t[u];
r=(j-u-1)*t[u];
m=max(l+r,m);
}
s.push(j);
}
printf("%d",m);
}