class Solution {
public int largestRectangleArea(int[] heights) {
if (heights == null || heights.length == 0) {
return 0;
}
Stack<Integer> stack = new Stack<>();
int ans = 0;
for (int i = 0; i <= heights.length; i++) {
int curtHeight = (i == heights.length) ? -1 : heights[i];
while (!stack.isEmpty() && curtHeight <= heights[stack.peek()]) {
int h = heights[stack.pop()];
int w = (stack.isEmpty()) ? i : i - stack.peek() - 1;
ans = Math.max(ans, w * h);
}
stack.push(i);
}
return ans;
}
}
