public static int largestRectangleArea(int[] heights) { Stack<Integer> stack = new Stack<>(); int length = heights.length; int[] left = newint[length]; int[] right = newint[length];
for (int i = 0; i < length; i++) { while (!stack.isEmpty() && heights[stack.peek()] >= heights[i]) { stack.pop(); } left[i] = stack.isEmpty() ? -1 : stack.peek(); stack.push(i); }
stack.clear(); for (int i = length - 1; i >= 0; i--) { while (!stack.isEmpty() && heights[stack.peek()] >= heights[i]) { stack.pop(); } right[i] = stack.isEmpty() ? length : stack.peek(); stack.push(i); }
int ans = 0; for (int i = 0; i < length; i++) { ans = Math.max(ans, (right[i] - left[i] - 1) * heights[i]); }