Preguntas sobre el cepillado de Niuke.net: problema del agua del recipiente

Descripción del problema

Cuánta agua puede pesar el contenedor como máximo, debido a que la altura del contenedor es una matriz, podemos atravesar la matriz y calcular la capacidad de agua de cada cuadrícula, y sumar la capacidad de agua más alta.

Ejemplo

Ejemplo 1

Ingrese
[3,1,2,5,2,4]

Salida
5

Soluciones

análisis

  1. Cuánta agua puede pesar el contenedor como máximo, debido a que la altura del contenedor es una matriz, podemos atravesar la matriz y calcular la capacidad de agua de cada cuadrícula, y sumar la capacidad de agua más alta.

método

  1. Solución violenta: atraviesa los elementos, según el elemento actual, encuentra la altura más alta leftHeight a la izquierda, encuentra la altura más alta rightHeight a la derecha y calcula la capacidad de agua de la cuadrícula actual: agua = min (leftHeight, rightHeight) - curHeight
  2. Método de doble puntero: comience a buscar desde los lados izquierdo y derecho al mismo tiempo, encuentre la altura más alta respectivamente, compare la altura de los lados izquierdo y derecho, tome la altura más baja, calcule la capacidad de agua, luego elimine la cuadrícula actual y Continúe el cálculo. (Nota: No es posible calcular ambos lados al mismo tiempo aquí, porque obtenemos la altura baja y la altura alta causará fugas de agua)
    Inserte la descripción de la imagen aquí
// 过程:
第0次循环:lmax = 3、rmax = 4
第0列的盛水量:0

第1次循环:lmax = 3、rmax = 4
第1列的盛水量:2

第2次循环:lmax = 3、rmax = 4
第2列的盛水量:1

第3次循环:lmax = 3、rmax = 4
第5列的盛水量:0

第4次循环:lmax = 5、rmax = 4
第4列的盛水量:2

第5次循环:lmax = 5、rmax = 4
第3列的盛水量:0

Código

// 思路2
public class Solution {
    
      
    public long maxWater (int[] arr) {
    
    
        // write code here
        if(arr==null || arr.length==0) return 0L;
        long ans = 0;
        int l=0, r=arr.length-1;
        int lmax = arr[0], rmax=arr[arr.length-1];
        while(l<=r) {
    
    
            lmax = Math.max(arr[l], lmax);
            rmax = Math.max(arr[r], rmax);
            if(lmax < rmax) {
    
    
                ans += lmax - arr[l];
                l++;
            } else {
    
    
                ans += rmax - arr[r];
                r--;
            }
        }
        return (long) ans;
    }
}

Análisis de complejidad de tiempo:
O (N): atraviesa la matriz

Análisis de complejidad del espacio:
O (1): No se utiliza espacio adicional

Si quieres hacer la prueba, puedes ir directamente al enlace de Niuke.com para hacer la prueba

Problema de agua de contenedor-niuke.com

Supongo que te gusta

Origin blog.csdn.net/qq_35398517/article/details/113996337
Recomendado
Clasificación