https://leetcode.com/problems/largest-rectangle-in-histogram/
找到柱状图之中的最大矩形面积
找出以heights[i]为最小长度的矩形面积可得结果。这个矩形的面积为heights[i] * i位置左右两侧第一个小于heights[i]的位置差(不将晓宇height[i]的这两个左右位置记入宽中,因此为i - j - 1)。如何找到左右两边小于heights[i]的位置呢?当前遍历到的比heights[i]小的位置就是右侧index,用stack保存一个升序序列当前栈顶就是左侧index。而heights[i]为当前栈pop出的元素。最后要用一个0把stack里面的所有元素全部pop出来,计算出以其为最小长度的矩形面积。
public class Solution {
public int largestRectangleArea(int[] heights) {
// 始终保持升序序列
Stack<Integer> stack = new Stack();
int res = 0;
for (int i = 0; i <= heights.length; i++) {
int height = i == heights.length ? 0 : heights[i];
while (!stack.isEmpty() && height <= heights[stack.peek()]) {
int h = heights[stack.pop()];
int j = stack.isEmpty() ? -1 : stack.peek();
res = Math.max(res, h * (i - j - 1));
}
stack.push(i);
}
return res;
}
}