题目描述
在歌曲列表中,第 i 首歌曲的持续时间为 time[i] 秒。
返回其总持续时间(以秒为单位)可被 60 整除的歌曲对的数量。形式上,我们希望索引的数字 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 整数。
提示:
解法
根据题意可知,需要找出数组中每一对数字,其数字和为 60
的整数倍,计算出共有多少对这样对数字。
因为每个数字都是正数,不妨数组中每位数字对 60
取余数,这样要求的两个数字和为 60
或 0
即可,而不再是 60
的整数倍。
此时问题变为求和问题,可以以哈希表或者数组形式,存储每个元素值对应出现的次数。
一次遍历即可获得最后的总对数。
对于元素值为
0
和30
的情况,其对数的个数为l*(l-1)/2
,根据对称性,只需遍历1~29
的情况即可。
class Solution:
def numPairsDivisibleBy60(self, time: List[int]) -> int:
arr=[0]*60
for i in range(len(time)):
arr[time[i]%60]+=1
ret=0
for l in [arr[0],arr[30]]:
ret+=l*(l-1)//2
for i in range(1,30):
ret+=arr[i]*arr[60-i]
return ret