[Una pregunta del día] Likou 135: Distribuya caramelos

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
解释:你可以分别给这三个孩子分发 212 颗糖果。

Ejemplo 2:

输入:[1,2,2]
输出:4
解释:你可以分别给这三个孩子分发 121 颗糖果。
     第三个孩子只得到 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
Inserte la descripción de la imagen aquí
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.
Inserte la descripción de la imagen aquí

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;

    }

Supongo que te gusta

Origin blog.csdn.net/weixin_45532227/article/details/111666811
Recomendado
Clasificación