给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。
求在该柱状图中,能够勾勒出来的矩形的最大面积。
以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]
。
图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10
个单位。
示例:
输入: [2,1,5,6,2,3]
输出: 10
思路: 我们可以从左到右遍历所有bar, 并将其push到一个stack中, 如果当前bar的高度小于栈顶bar, 我们pop出栈顶的bar, 同时以该bar计算矩形面积。 那么我们如何知道该bar的起点和终点呢呢?终点铁定就是当前遍历到的bar 的索引, 而起点则是当前的栈顶bar的索引, 因为此时栈顶bar的高度一定小于pop出来的bar的高度。
public int largestRectangleArea(int[] heights) {
if (heights == null || heights.length == 0) return 0;
//栈里存储的数字都是升序,存储的都是数组的下标
LinkedList<Integer> stack = new LinkedList<>();
int res = 0;
for (int i = 0; i <= heights.length ; i++){
//i == heights.length时赋值为0
int h = i == heights.length ? 0 : heights[i];
//只要栈里还存有数组且当前的h小于栈顶的数字
//开始计算面积
while (!stack.isEmpty() && h < heights[stack.peek()]){
//矩形的高度
int height = heights[stack.pop()];
//矩形的起点
int start = stack.isEmpty() ? -1 : stack.peek();
int area = (i - start - 1) * height;
res = Math.max(res, area);
}
stack.push(i);
}
return res;
}