题目描述
思路分析
单调栈
枚举每个高度作为“天花板“,左右扩展到最宽。意味着要找到某个数前边第一个比他小的数和后边第一个比他小的数。也即单调栈的经典用途。
代码实现
class Solution {
public:
int largestRectangleArea(vector<int>& h) {
int n=h.size();
vector<int> left(n),right(n);
stack<int> stk;
for(int i=0;i<h.size();i++){
while(stk.size()&&h[stk.top()]>=h[i]) stk.pop();
if(stk.empty()) left[i]=-1;
else left[i]=stk.top();
stk.push(i);
}
stk=stack<int>();
for(int i=n-1;i>=0;i--){
while(stk.size()&&h[stk.top()]>=h[i]) stk.pop();
if(stk.empty()) right[i]=n;
else right[i]=stk.top();
stk.push(i);
}
int ans=0;
for(int i=0;i<h.size();i++){
ans=max(ans,h[i]*(right[i]-left[i]-1));
}
return ans;
}
};