柱状图中最大的矩形+单调栈
题目:
思考:
- 维持一个单调增加的单调栈
- 遍历
- 遇到更低的高度时将栈内高于该元素的都出栈,并计算出栈高度的最大宽度(栈顶元素下表+1为左边界,当前遍历元素下标为右边界)
实现:
class Solution {
public:int largestRectangleArea(vector<int>& heights) {stack<pair<int,int>> stk;int ret=heights[0];stk.push({heights[0],0});int size=heights.size();for (int i=1;i<size;i++){while(!stk.empty()&&stk.top().first>heights[i]){auto top=stk.top();stk.pop();while(!stk.empty()&&stk.top().first==top.first){top=stk.top();stk.pop();}if (stk.empty()){ret=max(ret,i*top.first);}else{ret=max(ret,(i-stk.top().second-1)*top.first);}}stk.push({heights[i],i});}while(!stk.empty()){auto top=stk.top();stk.pop();while(!stk.empty()&&stk.top().first==top.first){top=stk.top();stk.pop();}if (stk.empty()){ret=max(ret,size*top.first);}else{ret=max(ret,(size-stk.top().second-1)*top.first);}}return ret;}
};