美文网首页
1010. 总持续时间可以被60整除的歌曲(Python)

1010. 总持续时间可以被60整除的歌曲(Python)

作者: 玖月晴 | 来源:发表于2021-05-17 20:08 被阅读0次

    难度:★★★☆☆
    类型:数组
    方法:数学

    题目

    力扣链接请移步本题传送门
    更多力扣中等题的解决方案请移步力扣中等题目录

    在歌曲列表中,第 i 首歌曲的持续时间为 time[i] 秒。

    返回其总持续时间(以秒为单位)可被 60 整除的歌曲对的数量。形式上,我们希望索引的数字 i 和 j 满足 i < j 且有 (time[i] + time[j]) % 60 == 0。

    示例 1:

    输入:[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

    示例 2:

    输入:[60,60,60]
    输出:3
    解释:所有三对的总持续时间都是 120,可以被 60 整数。

    提示:

    1 <= time.length <= 60000
    1 <= time[i] <= 500

    解答

    既然判断两数之和能否被60整除,则可以分解为两数除以60的余数之和是否能够达到60。

    准备一个计数器c,用来保存每个数字除以60的余数,以及能够得到这个余数的歌曲的数量。理论上,我们可以通过两次遍历,实现成对歌曲余数相加是否为60的判断,但是有了计数器,空间换了时间,我们就可以利用计数器里面的内容了,并在遍历过程中对计数器进行维护。

    需要注意一点,也就是例二的情况,如果存在长度为60或60的倍数的歌曲,其余数为零,不能用上述余数之和为60进行判别,我们做一个转化,用负数余数的方法来取代取余再相减的操作,这样就可以解决这个问题了。但是这种情况造成的问题是,如果歌曲的长度为零,则需要另外考虑,好在测试用例中没有这种情况。

    from collections import Counter
    
    
    class Solution:
        def numPairsDivisibleBy60(self, time):
            c = Counter()
            res = 0
            for t in time:
                res += c[-t % 60]
                c[t % 60] += 1
            return res
    

    如有疑问或建议,欢迎评论区留言~

    有关更多力扣中等题的python解决方案,请移步力扣中等题解析

    相关文章

      网友评论

          本文标题:1010. 总持续时间可以被60整除的歌曲(Python)

          本文链接:https://www.haomeiwen.com/subject/iavchltx.html