Descripción del título ( portal )
El maestro quiere distribuir dulces a los niños, N niños se paran en línea recta, y el maestro calificará a cada niño por adelantado según su desempeño.
Debe ayudar al maestro a distribuir dulces a estos niños de acuerdo con los siguientes requisitos:
A cada niño se le asigna al menos 1 dulce.
El niño con una puntuación más alta debe recibir más caramelos que los niños a su lado.
Entonces, ¿cuántos dulces debería preparar el maestro?
Ejemplo
Ejemplo 1:
输入:[1,0,2]
输出:5
解释:你可以分别给这三个孩子分发 2、1、2 颗糖果。
Ejemplo 2:
输入:[1,2,2]
输出:4
解释:你可以分别给这三个孩子分发 1、2、1 颗糖果。
第三个孩子只得到 1 颗糖果,这已满足上述两个条件。
Ideas
El niño con una puntuación más alta debe recibir más caramelos que los niños a su lado.
Según los requisitos, tenemos que considerar los lados de cada niño, por lo que hay dos reglas. Miré la solución y sentí que el método oficial aún era muy claro.
Dividimos los requisitos enRegla de la izquierdaconRegla correcta
Matriz de clasificación: clasificación [n]
estadísticas de la regla izquierda matriz de dulces: estadísticas de la regla izquierda [n]
derecha matriz de dulces: derecha [n]
Regla de la izquierda (comparada de izquierda a derecha según la matriz de calificación): cuando i = 0, izquierda [0] = 1, luego maneje i> 0, calificación [i]> calificación [i-1], izquierda [i] = izquierda [i-1] + 1; de lo contrario, izquierda [i] = 1;
Regla de la derecha (comparar de derecha a izquierda de acuerdo con la matriz de calificación): cuando i = n-1, derecha [n-1] = 1, entonces maneje 0 <= i <n-1, rating [i]> rating [i + 1], derecha [i] = derecha [i + 1] + 1; de lo contrario, derecha [i] = 1; la
línea roja en la figura de arriba es el resultado después de la regla de la izquierda. La línea verde es el resultado de la regla correcta.
Finalmente, como se muestra en la figura anterior, tomamos las reglas de la izquierda y la derecha, y el valor máximo correspondiente a cada persona puede asegurar que las reglas de la izquierda y la derecha se cumplan al mismo tiempo, y la suma sea el resultado final.
Código
public static int candy(int[] ratings) {
int[] left = new int[ratings.length];
for (int i = 0; i < ratings.length; i++) {
if(i > 0 && ratings[i] > ratings[i-1]) {
left[i] = left[i-1] + 1;
}else {
left[i] = 1;
}
}
int[] right = new int[ratings.length];
int ret = 0;
for (int i = ratings.length - 1; i >= 0; i--) {
if (i < ratings.length - 1 && ratings[i] > ratings[i + 1]) {
right[i] = right[i+1] + 1;
}
else {
right[i] = 1;
}
ret += Math.max(left[i] , right[i]);
}
return ret;
}