Leetcode 135. Distribuir algoritmo codicioso de dulces

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.
Entre los niños adyacentes, el niño con la puntuación más alta debe recibir más dulces.
Entonces, ¿cuántos dulces debería preparar el maestro?

Ejemplo 1:

Entrada: [1,0,2]
Salida: 5
Explicación: Puede distribuir 2, 1 y 2 caramelos a los tres niños.

ejemplo2:
Entrada: [1,2,2]
Salida: 4
Explicación: Puede distribuir 1, 2 y 1 caramelo a los tres niños.
El tercer niño solo recibe 1 caramelo, que ya cumple las dos condiciones anteriores.

Este problema puede ser resuelto por un algoritmo voraz
(Quiero usar un diccionario para resolver este problema, pero no parece el diccionario tener un índice)
en primer lugar crear una secuencia de longitud calificaciones, y asegurarse de que cada niño tiene 1 caramelos.
Traverse y filtrar de izquierda a derecha.
Después de
seleccionar los niños con puntajes más altos a la derecha que los de la izquierda, agregue uno al número de niños con puntajes más altos que aquellos con puntajes más bajos. Luego, recorra de derecha a izquierda para filtrar
los niños con puntajes más altos a la izquierda y luego dejar que los niños con puntajes más altos que los niños con puntajes más bajos. El número de caramelos se incrementa en uno
. Después de dos recorridos,
todos los niños con puntajes más altos que los niños a su lado obtienen más segundos caramelos que los niños con puntuaciones más bajas a su alrededor.
Finalmente, el valor en ans se atraviesa y se suma a res a la
salida ans.

Utiliza mucho reciclaje y la eficiencia operativa no es particularmente ideal

class Solution:
    def candy(self, ratings: List[int]) -> int:
        res = 0
        ans = [1] * len(ratings)
        
        for i in range(1, len(ratings)):
            if ratings[i] > ratings[i - 1] and ans[i] <= ans[i - 1]:
                ans[i] = ans[i - 1] + 1
        
        for j in range (len(ratings) -2, -1 , -1):
            if ratings[j] > ratings[j + 1] and ans[j] <= ans[j + 1]:
                ans[j] = ans[j + 1] + 1
        
        for z in ans:
            res += z
        
        return res

Supongo que te gusta

Origin blog.csdn.net/weixin_50791900/article/details/111637774
Recomendado
Clasificación