题目
给定非负整数数组 heights ,数组中的数字用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
示例
示例 1:
输入:heights = [2,1,5,6,2,3]
输出:10
解释:最大的矩形为图中红色区域,面积为 10
示例 2:
输入: heights = [2,4]
输出: 4
方法
单调栈
class Solution {
public int largestRectangleArea(int[] heights) {
// 创建一个栈存放递增的柱子
Deque<Integer> stack = new LinkedList<>();
// 压入一个-1的下标,用来处理栈顶左侧没有柱子的情况
stack.push(-1);
// 记录最大矩形面积
int maxArea = 0;
// 遍历数组
for (int i = 0; i < heights.length; i++) {
// 若栈有柱子元素(-1是想象虚拟的柱子),并且栈顶元素大于当前遍历的柱子高度执行逻辑
while (stack.peek() != -1 && heights[stack.peek()] >= heights[i]) {
// 弹出栈顶元素,计算栈顶元素的最大矩形面积
int height = heights[stack.pop()];
int width = i - stack.peek() - 1;
maxArea = Math.max(height * width, maxArea);
}
stack.push(i);
}
// 遍历完数组后,栈可能还有柱子的执行逻辑
while (stack.peek() != -1) {
int height = heights[stack.pop()];
int width = heights.length - stack.peek() - 1;
maxArea = Math.max(height * width, maxArea);
}
return maxArea;
}
}
1 先压入-1, 表示左侧无柱体
2 i - stack.peek() - 1表示 选中高度的柱体到它左右两侧更矮的柱体的距离,也就是宽度。