1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
   | package com.demo.s84;
  import java.util.Stack;
 
 
 
 
 
 
  public class Solution {     public int largestRectangleArea(int[] heights) {         int n = heights.length;         int[] left = new int[n];         int[] right = new int[n];
          Stack<Integer> mono_stack = new Stack<Integer>();         for (int i = 0; i < n; ++i) {             while (!mono_stack.isEmpty() && heights[mono_stack.peek()] >= heights[i]) {                 mono_stack.pop();             }             left[i] = (mono_stack.isEmpty() ? -1 : mono_stack.peek());             mono_stack.push(i);         }
          mono_stack.clear();         for (int i = n - 1; i >= 0; --i) {             while (!mono_stack.isEmpty() && heights[mono_stack.peek()] >= heights[i]) {                 mono_stack.pop();             }             right[i] = (mono_stack.isEmpty() ? n : mono_stack.peek());             mono_stack.push(i);         }
          int ans = 0;         for (int i = 0; i < n; ++i) {             ans = Math.max(ans, (right[i] - left[i] - 1) * heights[i]);         }         return ans;
      } }
   |