classSolution{publicintlargestRectangleArea(int[] heights){int n = heights.length;int newHeights[]=newint[n +2];
newHeights[0]=0;
newHeights[n +1]=0;for(int i =1; i < n +1; i++){
newHeights[i]= heights[i -1];}Stack<Integer> stack =newStack<>();
stack.push(0);int res =0;for(int i =1; i < n +2; i++){if(newHeights[i]> newHeights[stack.peek()]){
stack.push(i);}elseif(newHeights[i]== newHeights[stack.peek()]){
stack.pop();
stack.push(i);}else{while(!stack.isEmpty()&& newHeights[i]< newHeights[stack.peek()]){int height = newHeights[stack.pop()];int width = i - stack.peek()-1;
res =Math.max(res, height * width);}
stack.push(i);}}return res;}}
双指针
classSolution{publicintlargestRectangleArea(int[] heights){int n = heights.length;int minLeftIndex[]=newint[n];
minLeftIndex[0]=-1;int minRightIndex[]=newint[n];
minRightIndex[n -1]= n;for(int i =1; i < n; i++){int t = i -1;while(t >=0&& heights[t]>=heights[i]) t = minLeftIndex[t];
minLeftIndex[i]= t;}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;for(int i =0; i < n; i++){
res =Math.max(res,(minRightIndex[i]- minLeftIndex[i]-1)* heights[i]);}return res;}}