classSolution{publicintlargestRectangleArea(int[] heights){int n = heights.length;int[] minLeftIndex =newint[n];int[] minRightIndex =newint[n];
minLeftIndex[0]=-1;for(int i =1; i < n; i++){int t = i -1;while(t >=0&& heights[t]>= heights[i]) t = minLeftIndex[t];
minLeftIndex[i]= t;}
minRightIndex[n -1]= n;for(int i = n -2; i >=0; i--){int t = i +1;while(t < n && heights[t]>= heights[i]) t = minRightIndex[t];
minRightIndex[i]= t;}int res =0, sum =0;for(int i =0; i < n; i++){
sum = heights[i]*(minRightIndex[i]- minLeftIndex[i]-1);
res =Math.max(res, sum);}return res;}}
单调栈
classSolution{publicintlargestRectangleArea(int[] heights){int len = heights.length +2;int[] newHeight =newint[len];for(int i =1; i < len -1; i++) newHeight[i]= heights[i -1];Deque<Integer> stack =newArrayDeque<>();
stack.push(0);int res =0;for(int i =1; i < len; i++){while(!stack.isEmpty()&& newHeight[i]< newHeight[stack.peek()]){int mid = stack.pop();int h = newHeight[mid];int w = i - stack.peek()-1;
res =Math.max(res, h * w);}
stack.push(i);}return res;}}