单调栈。
如果用O(n^2)的算法,必定超时。
所以我们可以用单调栈,来实现O(n)效率的算法。
单调栈是递增的,每个长方形入栈时,都和栈顶的长方形高度对比,如果大于,则入栈。如果小于则按照高度合并长方形,直到比它高度小的元素,然后再进栈。
最后挨个出栈。
而出栈的过程才是真正计算长方形面积的过程。一个单调递增的栈,可以以O(1)的效率出栈,以O(n)效率,比较所有可能的组合情况,找出最大值。
所以关键就在单调栈这个思路
struct Node
{
int h;
int w;
Node(){}
Node(int h,int w)
{
this->h=h;
this->w=w;
}
}s[100005];
class Solution {
public:
int pos;
int largestRectangleArea(vector<int>& heights) {
if(heights.size()==0)
return 0;
pos=0;
int res=heights[0];
s[0]=Node(heights[0],1);
for(int i=1;i<heights.size();i++)
{
if(heights[i]>s[pos].h)
{
s[++pos]=Node(heights[i],1);
}
else
{
int num=0;
while(pos!=-1&&heights[i]<=s[pos].h)
{
num+=s[pos].w;
res=max(res,s[pos].h*num);
pos--;
}
s[++pos]=Node(heights[i],num+1);
}
}
int num=0;
while(pos!=-1)
{
num+=s[pos].w;
res=max(res,s[pos].h*num);
pos--;
}
return res;
}
};