描述
给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
分析
- 最大的面积等于求出以每个柱子的高度为矩形的高的最大面积,保存最大的那个矩形面积。
以每个柱子的高度为矩形的高的最大面积,需要找到矩形的左右边界,通过求得每个柱子的左右第一个低于他的柱子的下标,即可得到矩形的左右边界。 - 利用单调栈可以一次遍历就能够求得一个柱子左右两边第一个低于他的柱子的下标。
- 将原始数组头尾添加一个0,这样遍历结束栈中元素一定会被全部弹出,计算举行面方便很多。
class Solution {
public int largestRectangleArea(int[] heights) {
int[] res = new int[heights.length + 2];
for(int i = 1; i <= heights.length; i++){
res[i] = heights[i-1];
}
Stack<Integer> stack = new Stack<>();
int max = 0;
for(int i = 0; i < res.length; i++){
while(!stack.isEmpty() && res[stack.peek()] > res[i]){
int tmp = stack.pop();
int square = res[tmp]*(i-stack.peek()-1);
max = Math.max(max,square);
}
stack.push(i);
}
return max;
}
}