Categorías
Algorithms Interview Java

LeetCode – Candy (Java)

Hay N niños en fila. A cada niño se le asigna un valor de calificación. Estás regalando caramelos a estos niños sujetos a los siguientes requisitos:

1. Cada niño debe tener al menos un dulce.
2. Los niños con una calificación más alta obtienen más dulces que sus vecinos.

¿Cuál es el mínimo de caramelos que debes regalar?

Análisis

Este problema se puede resolver en O (n) tiempo.

Siempre podemos asignar a un vecino 1 más si el vecino tiene un valor de calificación más alto. Sin embargo, para obtener el número total mínimo, siempre debemos comenzar a agregar 1 en orden ascendente. Podemos resolver este problema escaneando la matriz desde ambos lados. Primero, escanee la matriz de izquierda a derecha y asigne valores para todos los pares ascendentes. Luego escanee de derecha a izquierda y asigne valores a pares descendentes.

Este problema es similar a Atrapar el agua de lluvia.

Solución Java

public int candy(int[] ratings) {
	if (ratings == null || ratings.length == 0) {
		return 0;
	}
 
	int[] candies = new int[ratings.length];
	candies[0] = 1;
 
	//from let to right
	for (int i = 1; i < ratings.length; i++) {
		if (ratings[i] > ratings[i - 1]) {
			candies[i] = candies[i - 1] + 1;
		} else { 
			// if not ascending, assign 1
			candies[i] = 1;
		}
	}
 
	int result = candies[ratings.length - 1];
 
	//from right to left
	for (int i = ratings.length - 2; i >= 0; i--) {
		int cur = 1;
		if (ratings[i] > ratings[i + 1]) {
			cur = candies[i + 1] + 1;
		}
 
		result += Math.max(cur, candies[i]);
		candies[i] = cur;
	}
 
	return result;
}

Por Programación.Click

Más de 20 años programando en diferentes lenguajes de programación. Apasionado del code clean y el terminar lo que se empieza. ¿Programamos de verdad?

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *