diario de preguntas de pincel de leetcode- [84. El rectángulo más grande en el gráfico de barras]

¡Trabajar juntos para crear y crecer juntos! Este es el día 32 de mi participación en el "Nuggets Daily New Plan·Desafío de actualización de agosto", haga clic para ver los detalles del evento

Tema Descripción

Dados n enteros no negativos que representan la altura de cada columna en el histograma. Cada columna es adyacente entre sí y tiene un ancho de 1.

Encuentra el área máxima del rectángulo que se puede dibujar en este histograma.

 

Ejemplo 1:

imagen.png

Entrada: alturas = [2,1,5,6,2,3] Salida: 10 Explicación: El rectángulo más grande es el área roja de la figura, con un área de 10 Ejemplo 2:

imagen.png

Entrada: alturas = [2,4] Salida: 4  

insinuación:

  • 1 <= alturas.longitud <=105
  • 0 <= alturas[i] <= 104

Ideas para resolver problemas

Dada una matriz de alturas, simule un histograma, cada elemento de la matriz corresponde a la altura de columna de cada coordenada, y el ancho de cada columna es 1; encuentre el área del rectángulo más grande que se puede formar en el histograma;

Esta pregunta es un poco similar a la pregunta sobre la lluvia máxima que se puede recibir. Pero la diferencia aquí es el rectángulo que se puede formar, y esa pregunta es el área máxima de superposición, es decir, también es posible que se superpongan varios rectángulos.

Primero, determine cómo obtener el rectángulo más grande que cada columna puede formar en el histograma.

Asumir alturas=[2,3,4,1,2];

Entonces el rectángulo máximo que puede formar la primera columna depende de la posición del primer valor menor que se busca hacia atrás desde su posición, porque la altura de un rectángulo debe ser igual, y el rectángulo máximo que puede formar la elemento actual La altura de es en sí misma (cualquier cosa más alta que no puede ser un rectángulo);

Es decir, el rectángulo más grande que puede formar el primer pilar 2 es 2*3=6;

Continúe buscando la segunda columna 3, mira hacia atrás, la primera columna más pequeña que está ubicada en 3; pero aquí todavía tiene elementos anteriores, por lo que, a excepción de la primera columna, las columnas restantes tienen que mirar hacia adelante a la primera columna A columna más pequeña que ella. Entonces el área rectangular máxima de la segunda columna es 3*(1+1)=6;

Y así sucesivamente, hasta que se encuentre la última columna. En este momento, debido a que la última columna no tiene columnas posteriores, solo necesita buscar la primera columna que es más pequeña que ella. Si no hay columna, es ella misma, es decir, la última columna puede formar El área rectangular máxima de es 2;

Se puede ver que en la matriz heights, para encontrar el área rectangular máxima, el elemento actual es encontrar el primer elemento más pequeño que él hacia adelante o hacia la derecha , y luego sumarlo. Entonces aquí podemos aplicar la idea del nodo centinela, es decir, crear un nodo inexistente para que todos los nodos puedan usar la misma operación y reducir la complejidad del código;

Así, necesitas encontrar el primer valor grande o pequeño según la dirección, puedes usar la pila monótona para resolverlo.

Código

public static int largestRectangleArea(int[] heights) {
    int length = heights.length;
    int[] left = new int[heights.length];
    int[] right = new int[heights.length];
    // 向前寻找第一个小于它的柱子
    ArrayDeque<Integer> arrayDeque = new ArrayDeque<>();
    for (int i=0; i< length; i++) {
        // 单调栈中只要有值就可以一直弹出
        while (!arrayDeque.isEmpty() && heights[arrayDeque.peek()] >= heights[i]) {
            arrayDeque.poll();
        }
        // 此时单调栈中的元素一定是第一个小于当前元素的值,如果为空,则直接将这个位置赋值为-1
        left[i] = arrayDeque.isEmpty() ? -1 : arrayDeque.peek();
        arrayDeque.push(i);
    }
    // 清空单调栈
    arrayDeque.clear();
    for (int i=length-1; i>= 0; i--) {
        // 单调栈中只要有值就可以一直弹出
        while (!arrayDeque.isEmpty() && heights[arrayDeque.peek()] >= heights[i]) {
            arrayDeque.poll();
        }
        // 此时单调栈中的元素一定是第一个小于当前元素的值,如果为空,则直接将这个位置赋值为n
        right[i] = arrayDeque.isEmpty() ? length : arrayDeque.peek();
        arrayDeque.push(i);
    }
    // 获取最大面积
    int max = 0;
    for (int i=0 ; i < length ; i ++) {
        max = Math.max(max,heights[i] * (right[i]-left[i]-1));
    }
    return max;
}
复制代码

Supongo que te gusta

Origin juejin.im/post/7136828780630245390
Recomendado
Clasificación