原题地址:https://leetcode.cn/problems/largest-rectangle-in-histogram/ 
题解
单调栈,分别用两个数组,leftMin[i]记录i左侧第一个高度小于i的下标,rightMin[i]记录i右侧第一个高度小于i的下标
对于以height[i]为高度的矩形,我们可以知道其面积为
取所有矩形面积的最大值即可
时间复杂度:O(N)
空间复杂度:O(N)
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 43
   | class Solution {     public int largestRectangleArea(int[] heights) {         Stack<Integer> stack=new Stack<>();         int[] leftMin=new int[heights.length];         int[] rightMin=new int[heights.length];         int max=Integer.MIN_VALUE;
 
          for (int i=0;i<heights.length;i++){             while (!stack.isEmpty()){                 if(heights[stack.peek()]>=heights[i]){                     stack.pop();                 }else{                     leftMin[i]=stack.peek();                     stack.push(i);                     break;                 }             }             if(stack.isEmpty()){                 leftMin[i]=-1;                 stack.push(i);             }         }         stack=new Stack<>();         for (int i= heights.length-1;i>=0;i--){             while (!stack.isEmpty()){                 if(heights[stack.peek()]>=heights[i]){                     stack.pop();                 }else{                     rightMin[i]=stack.peek();                     stack.push(i);                     break;                 }             }             if(stack.isEmpty()){                 rightMin[i]=heights.length;                 stack.push(i);             }             max=Math.max(max,heights[i]*(rightMin[i]-leftMin[i]-1));         }         return max;     } }
  |