Ideas:
El significado de la pregunta puede entenderse como comparar si el actual es más pequeño que el anterior, si es más grande, continuar, si es más pequeño, eliminar el anterior y seguir comparando.
Es fácil pensar en usar una pila monótona
Código:
class Solution {
public int largestRectangleArea(int[] heights) {
int n=heights.length,max=0;
Deque<Integer> stack=new ArrayDeque<>();
for(int i=0;i<=n;i++){
//条件是:1.不为空 2.当前height小于栈顶端的height 3.i到了最后
while(!stack.isEmpty()&&(i==n||heights[i]<heights[stack.peekLast()])){
//先一步把值弹出,下面算的peekLast就是再前一个的下标
int height=heights[stack.removeLast()];
int width=stack.isEmpty()?i:i-1-stack.peekLast();
max=Math.max(max,height*width);
}
//若不满足while的条件,就把值压入栈中(heights[i]>heights[stack.peek()])
stack.addLast(i);
}
return max;
}
}
descomponer:
1) Utilice ArrayDeque en lugar de ArrayList, LinkedList o Stack
La razón es que ArrayDeque y ArrayList tienen forma de matrices, mientras que LinkedList tiene forma de listas enlazadas y Stack no se recomienda en Java (consulte otra publicación de blog https://blog.csdn.net/di_ko/article/ detalles / 115004162 )
2)
int height=heights[stack.removeLast()];
int width=stack.isEmpty()?i:i-1-stack.peekLast();
Estas pocas líneas de código en realidad están algo abreviadas, la versión original es:
int height=heights[stack.peekLast()];
int width=stack.isEmpty()?i:i-stack.peekLast();
stack.removeLast();
3) El siguiente código fuera del ciclo while es en realidad un poco más simple
stack.addLast(i);
Versión original:
whie(...){
stack.addLast(i);
}
if(heights[i]<heights[stack.peekLast()]){
stack.addLast(i);
}