很棒的一道题,比较好的解决办法是扫描一遍再O(N)的时间消耗内。 看了很多人的解答,感觉关键还是找到下降节点。 我们令最右侧的右边高度为0,那么整个数组肯定能够找到下降节点。 下降节点限制了其左侧比该节点高的所有立方柱的高度为该节点高度。 我们只需在找到每个下降节点时统计其左侧所有比其高的立方柱构成的矩形的最大面积,之后就可以把这些立方柱的高度看作下降节点的高度。 这样在之后的计算中就无需考虑这些立方柱了。 之后回顾时要好好再看看代码。
public class Solution {
public int largestRectangleArea(int[] height) {
int len = height.length;
if( len==0 )
{
return 0;
}
Stack<Integer> l=new Stack<Integer>();
Stack<Integer> h=new Stack<Integer>();
l.push(0);h.push(height[0]);
int res=0;
for( int i=1;i<=len;i++ )
{
int top = h.peek();
int cur_h;
if( i==len )
{
cur_h = 0;
}
else
{
cur_h = height[i];
}
if( top<=cur_h )
{
l.push(i);
h.push(cur_h);
}
else
{
int index = l.peek();
while(top>=cur_h)
{
index = l.peek();
int area=top*(i-index);
if( area>res )
{
res = area;
}
l.pop();
h.pop();
if( l.empty() )
{
break;
}
top = h.peek();
}
l.push(index);
h.push(cur_h);
}
}
return res;
}
}