2020-05-17
1.题目描述
柱状图中最大的矩形
2.题解
对于某一个柱子而言,和它一样高的矩形的宽度为找到它两边最近的比它小的柱子,它们之间的距离就是当前
的宽,我们需要从左到右、从右到左分别找到比当前柱子最近的最小的,在这里维护一个单调递增的的栈即可。
3.代码
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int l=heights.size();
if (l==0) return 0;
vector<int> x1(l,0);
vector<int> x2(l,0);
stack<int> mystack;
for (int i=0;i<l;i++){
while (!mystack.empty()&&heights[mystack.top()]>heights[i]){
x1[mystack.top()]=i-mystack.top()-1;
mystack.pop();
}
mystack.push(i);
}
while(!mystack.empty()){
x1[mystack.top()]=l-mystack.top()-1;
mystack.pop();
}
for (int i=l-1;i>=0;i--){
while (!mystack.empty()&&heights[mystack.top()]>heights[i]){
x2[mystack.top()]=mystack.top()-i-1;
mystack.pop();
}
mystack.push(i);
}
while(!mystack.empty()){
x2[mystack.top()]=mystack.top();
mystack.pop();
}
int res=0;
for (int i=0;i<l;i++){
int tmp=heights[i]*(1+x2[i]+x1[i]);
res=max(res,tmp);
}
return res;
}
};