解法是单调栈。下面是加哨兵的解法。
public int largestRectangleArea(int[] heights) {
int res = 0;
int len = heights.length;
if (len == 0)
return 0;
int[] newHeights = new int[len + 2];
for (int i = 1; i <= len; i++) {
newHeights[i] = heights[i - 1];
}
newHeights[len + 1] = 0;
heights = newHeights;
Deque<Integer> stack = new ArrayDeque<>();
stack.addLast(0);
for (int i = 1; i < heights.length; i++) {
while (heights[stack.peekLast()] > heights[i]) {
int index = stack.removeLast();
int width = i - stack.peekLast() - 1;
res = Math.max(width * heights[index], res);
}
stack.addLast(i);
}
return res;
}