El tema es de LeetCode
Se puede acceder a otras soluciones o código fuente: tongji4m3
descripción
Dado n números enteros no negativos que representan el mapa de altura de cada columna con un ancho de 1, calcule cuánta agua de lluvia pueden recibir las columnas dispuestas de esta manera.
Lo anterior es el mapa de altura representado por la matriz [0,1,0,2,1,0,1,3,2,1,2,1]. En este caso, 6 unidades de lluvia (azul Parte significa lluvia).
Ejemplo:
输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6
Ideas
Encuentra la posición más alta a la izquierda: atraviesa de izquierda a derecha
Encuentra la posición más alta a la derecha: atraviesa de derecha a izquierda
Encuentre la altura más alta a la izquierda y la altura más alta a la derecha de cada ubicación, y tome la más pequeña, la altura de esa ubicación. Esa es el agua de lluvia en esa ubicación
Acumula el agua de lluvia recolectada en cada lugar
Código
public int trap(int[] height)
{
int n = height.length;
if (n <= 2) return 0;//接不了雨水
int[] left = new int[n];
int[] right = new int[n];
left[0] = height[0];
for (int i = 1; i < n; i++) left[i] = Math.max(left[i - 1], height[i]);
right[n - 1] = height[n - 1];
for (int i = n - 2; i >= 0; i--) right[i] = Math.max(right[i + 1], height[i]);
int result = 0;
for (int i = 0; i < n; i++) result += (Math.min(left[i], right[i]) - height[i]);
return result;
}
Análisis de complejidad
complejidad del tiempo
O (N) O (N) O ( N ) , tres ciclos, cada vez requiere N, un total de 3N
Complejidad espacial
O (N) O (N) O ( N ) , defina dos matrices de tamaño N, el espacio total requerido es 2N