【柱状图中最大的矩形】单调栈
计算矩形面积需要三要素,高,左端点和右端点。
高的枚举可以直接枚举每个柱子的高度,那以每个柱子为高,矩形的左右端点如何确定?
单调栈维护柱子索引,保证柱子索引递增以及栈中索引对应的柱子高度也是递增的
那么柱子左端点显而易见就是栈中前一个元素,柱子的右端点则是该柱子被弹栈时即将要插入的柱子
注意:
- 柱子遍历完毕后栈中剩余元素的处理
- 第一个柱子的左端点:无穷高的虚拟柱子(索引为-1)
点击查看代码
class Solution {
public int largestRectangleArea(int[] heights) {
Stack<Integer> stack = new Stack<>();
int i = 0;
int l, r, h;
int ans = 0;
while(i <= heights.length) {
r = i;
while(!stack.empty() && (r == heights.length || heights[stack.peek()] >= heights[i])) {
h = heights[stack.pop()];
l = stack.empty() ? -1 : stack.peek();
ans = Math.max((r - l - 1) * h, ans);
}
stack.push(i ++ );
}
return ans;
}
}