Leetcode [1010] Canciones cuya duración total es divisible por 60

1010. Canciones cuya duración total es divisible por 60

Recientemente, he estado ocupado con la finalización del proyecto, por lo que Leetcode solo repasó las preguntas diarias.

tema

En la lista de canciones, la duración de la iprimera canción es time[i]de segundos.

Devuelve el número de pares de canciones cuya duración total (en segundos) es 60divisible . Formalmente, queremos que los números de subíndice iy jsatisfagan i < jy tengan (time[i] + time[j]) % 60 == 0.

Ejemplo 1:

输入:time = [30,20,150,100,40]
输出:3
解释:这三对的总持续时间可被 60 整除:
(time[0] = 30, time[2] = 150): 总持续时间 180
(time[1] = 20, time[3] = 100): 总持续时间 120
(time[1] = 20, time[4] = 40): 总持续时间 60

Fuente: LeetCode
Enlace: https://leetcode.cn/problems/pairs-of-songs-with-total-durations-divisible-by-60

ideas para resolver problemas

Hay un comentario en el área de comentarios del tema que dice bien: "Si ve que el conjunto de datos es mayor que 1e5, no piense en la complejidad temporal de O(N^2), y no puede pasarlo si tú lo especificas". Sin embargo, después de leer el título estúpidamente, todavía no pude evitarlo y presenté una solución violenta:

class Solution:
    def numPairsDivisibleBy60(self, time: List[int]) -> int:
        n = len(time)
        count = 0
        for i in range(n-1):
            for j in range(i+1,n):
                if (time[i]+time[j])%60 == 0:
                    count += 1
        return count

No hay duda de que la operación se agotó. Entonces comencé a pensar seriamente en el tema. En ese momento, algunos punteros en colisión y ventanas deslizantes de la matriz aparecieron en mi mente, pero parecían ser inútiles. Luego, haga clic en las etiquetas relevantes debajo del título y encuentre la palabra clave "tabla hash", que me recordó el diccionario de Pyhton. Entonces existe la siguiente solución:

from math import comb

class Solution:
    def numPairsDivisibleBy60(self, time: List[int]) -> int:
        count = 0
        count_dict = dict.fromkeys(range(60), 0)
        for t in time:
            count_dict[t%60] += 1
        for i in range(0, 31):
            if i == 0 or i == 30:
                if count_dict[i]>1:
                    count += comb(count_dict[i], 2)
            else:
                count += count_dict[60 - i] * count_dict[i]
        return count

Ignorando la solución que me tomó una hora entera encontrar, fue una sorpresa y un placer mostrar finalmente que el registro de confirmación tardó más del 91 % en pasar el tiempo de ejecución hhh.

No entraré en detalles sobre mi proceso de pensamiento aquí, solo hablaré sobre mi idea final: construir un diccionario para registrar el número de ocurrencias del valor obtenido por el módulo 60 de la duración de la canción. Sabemos que la suma de dos números cualquiera puede ser divisible por 60, lo que significa que la suma de los dos números módulo 60 es 60, y el resultado de multiplicar el número de ocurrencias de los dos es el par de canciones que se necesita contar en la cantidad del título. Para dos números cuyos resultados de módulo son 0 y 30, la suma de dos números también cumple con los requisitos, por lo que es su logaritmo combinado. Debido a que la necesidad está satisfecha i<j, solo necesitamos contar los logaritmos de las canciones en la primera mitad, es decir 0,[1,29], 30.

Más tarde, se encontró que no hay necesidad de llamar a la combfunción combinada.El nnúmero de pares de números es: n ( n − 1 ) / 2 n(n-1)/2norte _ _1 ) /2 . Se puede simplificar de nuevo:

class Solution:
    def numPairsDivisibleBy60(self, time: List[int]) -> int:
        count = 0
        count_dict = dict.fromkeys(range(60), 0)
        for t in time:
            count_dict[t%60] += 1
        for i in range(0, 31):
            if i == 0 or i == 30:
                count += count_dict[i]*(count_dict[i]-1)//2
            else:
                count += count_dict[60 - i] * count_dict[i]
        return count

Supongo que te gusta

Origin blog.csdn.net/qq_39784672/article/details/130541076
Recomendado
Clasificación