Podemos hacer esto en tiempo lineal usando una pila, lo cual es óptimo ya que necesitamos inspeccionar cada valor en el histograma.
Supongamos por conveniencia que tenemos las alturas de los N rectángulos en una matriz. Procesaremos la matriz de izquierda a derecha y mantendremos una pila de alturas junto con un índice que indique qué tan a la izquierda puede extenderse un rectángulo de esa altura.
La pila contendrá los índices correspondientes a los rectángulos donde podemos comenzar a crear un rectángulo en ese índice, extendiéndose tan a la derecha como hemos visto sin encontrar una altura menor que nuestra altura dada. Esto significa que las entradas en la pila, de abajo hacia arriba, aumentarán monotónicamente en altura.
- Cómo seleccionar aleatoriamente una palabra de un archivo que contiene 1,000 palabras (1 palabra por línea) y mostrarla en un programa C ++
- Cómo responder a las consultas de rango medio de manera eficiente
- ¿Qué es una prueba intuitiva de que las redes neuronales recurrentes pueden calcular cualquier función computable por una máquina Turing?
- Cómo calcular todos los quíntuples ordenados de números primos (a, b, c, d, e) de modo que [matemática] a + \ sqrt {b ^ 2 + c} = \ sqrt {d ^ 2 + e} [/ matemática]
- ¿Cuáles son algunas formas interesantes de usar tecnologías no convencionales en la programación?
Cuando consideramos un rectángulo de una altura dada, buscamos en la pila rectángulos que no podrían extenderse más allá de nuestro rectángulo dado. Si es así, calculamos el área de ese rectángulo y lo consideramos un candidato, y luego lo eliminamos de nuestra pila.
Seguiremos eliminando elementos de la pila hasta que la pila esté vacía o la altura superior de la pila no esté bloqueada por nuestra altura actual. Entonces, queremos empujar nuestra altura actual en la pila. Tenga en cuenta que un rectángulo con una altura igual a nuestra altura actual puede extenderse más hacia la izquierda si quitamos rectángulos de la pila. Si no hemos eliminado ningún rectángulo de la pila, entonces el índice dado es el índice más a la izquierda que puede comenzar el rectángulo dado.
Una vez que hayamos procesado todos los elementos de la matriz, necesitaremos borrar la pila para asegurarnos de que el área rectangular máxima no esté alineada con el lado derecho del histograma.
Para tener en cuenta que este es el tiempo lineal, hacemos trabajo constante amortizado por altura (empujamos como máximo un número lineal de artículos en la pila).