leetcode 11. Contenedor con la mayor cantidad de agua (python)

¡Acostúmbrate a escribir juntos! Este es el octavo día de mi participación en el "Nuggets Daily New Plan · April Update Challenge", haz clic para ver los detalles del evento .

describir

Se le da una altura de matriz de enteros de longitud n. Hay n líneas verticales dibujadas de manera que los dos extremos de la i -ésima línea son (i, 0) y (i, altura[i]).

Encuentra dos rectas que junto con el eje x formen un recipiente, tal que el recipiente contenga la mayor cantidad de agua.

Devuelve la máxima cantidad de agua que un recipiente puede almacenar. Ten en cuenta que no puedes inclinar el recipiente.

Ejemplo 1:

Input: height = [1,8,6,2,5,4,8,3,7]
Output: 49
Explanation: The above vertical lines are represented by array [1,8,6,2,5,4,8,3,7]. In this case, the max area of water (blue section) the container can contain is 49.
复制代码

Nota:

n == height.length
2 <= n <= 10^5
0 <= height[i] <= 10^4
复制代码

Analizar gramaticalmente

De acuerdo con el significado de la pregunta, dada una altura de matriz entera de longitud n. Se dibujan N líneas verticales de manera que los puntos bajo y alto de la i-ésima línea sean (i, 0) y (i, altura[i]) respectivamente.

Encuentra dos líneas que junto con el eje x formen un recipiente que tenga la mayor cantidad de agua en el recipiente. Devuelve la máxima cantidad de agua que puede almacenar el contenedor.

Esta pregunta es muy interesante, porque está muy cerca de la escena de la vida, a veces nos encontramos con este tipo de situación de encontrar el valor extremo bajo ciertas condiciones. De hecho, las preguntas del examen incluyen algoritmos codiciosos y punteros dobles. Las preguntas del examen que combinan los dos puntos de conocimiento son raras.

Si es una solución de fuerza bruta, definitivamente expirará, por lo que AC se puede usar con punteros dobles. Definimos S(i, j) como el área de acomodación de i a j. Ya sea que la columna más a la izquierda se mueva hacia la derecha o la columna más a la derecha se mueva hacia la izquierda, el ancho será más pequeño, por lo que queremos asegurar la capacidad máxima , solo para hacer un escándalo por la altura de la columna, hay dos operaciones:

  • Retire la columna más corta, de modo que la capacidad del recipiente esté determinada por la más corta, min(h[i], h[j]) * (ji) puede contener más agua, por supuesto, si encuentra una más corta. La columna también puede contener menos agua de esta manera
  • Retire la columna más larga, la capacidad del contenedor está determinada por la más corta, por lo que la columna más corta min(h[i], h[j]) del contenedor probablemente permanecerá igual o será más corta, por lo que la capacidad definitivamente será menor. cambio pequeño

Por lo tanto, podemos usar dos punteros a las columnas izquierda y derecha del contenedor. En cada ronda, eliminamos la columna más corta, actualizamos la capacidad máxima, hasta que los dos punteros se encuentran y finalmente volvemos al área máxima.

La complejidad temporal es O(N) y la complejidad espacial es O(N).

responder

class Solution(object):
    def maxArea(self, height):
        """
        :type height: List[int]
        :rtype: int
        """
        if len(height) == 2: return min(height[0], height[1]) * 1
        N = len(height)
        left = 0
        right = N - 1
        result =  min(height[left], height[right]) * (right - left)
        while left < right:
            if height[left] <= height[right]:
                left += 1
            else:
                right -= 1
            result = max( result, min( height[right], height[left]) * (right-left) )
        return result		
复制代码

resultado de la operación

Runtime: 763 ms, faster than 43.95% of Python online submissions for Container With Most Water.
Memory Usage: 23.9 MB, less than 53.52% of Python online submissions for Container With Most Water.
复制代码

Enlace del título original

leetcode.com/problemas/co…

Tu apoyo es mi mayor motivación.

Supongo que te gusta

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