难度:★★★☆☆
类型:数组
方法:数学
题目
力扣链接请移步本题传送门
更多力扣中等题的解决方案请移步力扣中等题目录
在歌曲列表中,第 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解决方案,请移步力扣中等题解析
网友评论