题目:
Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.
Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3]
.
The largest rectangle is shown in the shaded area, which has area = 10
unit.
For example,
Given height = [2,1,5,6,2,3]
,
return 10
.
之前做过类似的题,有O(n)复杂度的做法,用栈维护一个递增的序列,栈中存对应高度的位置。
每遍历一个元素,判断是否是栈中最大的元素,如果不是,把栈顶的元素弹出,并计算以栈顶元素为最大值高度时的长方形面积。
面积的长度为栈顶元素之前的一个元素到当前遍历的元素的之间的长度,边界情况特殊考虑。
class Solution { public: int largestRectangleArea(vector<int> &height) { stack<int>s; int len=height.size(),maxx=0; for(int i=0;i<len;++i) { if(s.empty())s.push(i); else { while(!s.empty()&&height[s.top()]>height[i]) { int ph=s.top(); s.pop(); if(!s.empty()) maxx=max(maxx,(i-s.top()-1)*height[ph]); else maxx=max(maxx,i*height[ph]); } s.push(i); } } while(!s.empty()) { int ph=s.top(); s.pop(); if(!s.empty()) maxx=max(maxx,(len-s.top()-1)*height[ph]); else maxx=max(maxx,len*height[ph]); } return maxx; } };