84. El rectángulo más grande del histograma (dificultad)

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);
}

 

Supongo que te gusta

Origin blog.csdn.net/di_ko/article/details/115002489
Recomendado
Clasificación