原题目:https://leetcode-cn.com/problems/largest-rectangle-in-histogram/
思路:
使用单调栈,分别存储i左边最近的、高度比他小的index,i的右边最近的、高度比他小的index。
单调栈的思想,从左向右遍历heighs数组,每次判断栈中的元素,依次剔除栈中元素,直到栈顶元素的高度小于heights[i]。
注意:每次剔除依次的元素,i就是所剔除元素右边最近的、高度比他小的index。
i的左边最近的、高度比他小的index,就是此时栈顶的元素。
代码:
class Solution {
public:
int largestRectangleArea(vector<int>& heights) {
int n=heights.size();
vector<int> left(n),right(n,n);
stack<int> mono_stack;
mono_stack.push(-1);
for(int i=0;i<n;i++){
while(mono_stack.top()!=-1 && heights[mono_stack.top()]>=heights[i]){
right[mono_stack.top()]=i;
mono_stack.pop();
}
left[i] = mono_stack.top();
mono_stack.push(i);
}
int ans = 0;
for(int i=0;i<n;i++){
ans = max(ans,(right[i]-left[i]-1)*heights[i]);
}
return ans;
}
};