leetcode84. Rectángulo grande en el histograma

tema:

Dado  n  enteros no negativos que representan altura de la barra del histograma en el que el ancho de cada barra es 1, encontrar el área de rectángulo más grande en el histograma.

 


El anterior es un histograma donde el ancho de cada barra es 1, dadas altura =  [2,1,5,6,2,3].

 


El rectángulo más grande se muestra en el área sombreada, que tiene área =  10 unidad.

Ejemplo:

Entrada: [2,1,5,6,2,3]
 Salida: 10

 

Ideas Violencia:

A través de cada columna, que es la búsqueda de la máxima altura del área rectangular (mira a la izquierda ya la derecha de la primera más pequeña que sus pilares, llamados el borde izquierdo y el borde derecho ). Finalmente obtener área máxima global. El tiempo de complejidad de O (N ^ 2)

Mejora:

Este es un tipo de pregunta con trampa problema, me siento personalmente poca importancia

1, con una pila, seguido por el índice de la columna empujado, cuando la parte superior de la pila a ser presionado en la columna por encima de la columna, podemos encontrar, encontramos una pila pilares de la frontera derecha . Vamos a publicar la pila pop, que se denota por x, y empezamos a buscar su borde izquierdo.

2, ya que la estrategia de ajuste a presión por encima de, la altura de la pila de la columna debe ser <= altura x. Continuar para que aparezca el elemento superior (estas columnas == altura x altura) hasta que la altura de la columna de la parte superior de la pila <altura x. Entonces nos encontramos con las x borde izquierdo . X se puede calcular como la altura máxima de la zona rectangular.

3, entonces tenemos un nuevo tope de la pila, por lo que tomó el nuevo superior de la pila y para empujar el pilar a pilar de ... repetir la acción anterior hasta la parte superior de las columnas de la pila <= empujar pilares

El mapa se dibuja una muy intuitiva, pero no voy a dibujar, se puede ver la resolución leetcode

class Solution:
    def largestRectangleArea(self, heights: List[int]) -> int:
        blocks = [0]
        maxArea = 0
        heights.append(0)
        for i in range(1,len(heights)):
            while len(blocks)>0 and heights[blocks[-1]] > heights[i]:
                right = i-1
                h = heights[blocks.pop()]
                while len(blocks)>0 and heights[blocks[-1]] == h:
                    blocks.pop()
                if len(blocks)>0:
                    left = blocks[-1]
                else:
                    left = -1
                maxArea = max(maxArea, h*(right-left))
            blocks.append(i)
        return maxArea

 

 

 

Publicado 82 artículos originales · ganado elogios 2 · Vistas 4340

Supongo que te gusta

Origin blog.csdn.net/qq_22498427/article/details/105091562
Recomendado
Clasificación