题目描述
在歌曲列表中,第 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 整数。
提示:
1 <= time.length <= 60000
1 <= time[i] <= 500
算法1
(统计频次+组合计算) $O(n)$
统计time
数组中模60
的种类和每种模的频次,然后根据组合数计算他们对答案的贡献,比如20+40==60
,那么答案就增加cnt[20]*cnt[40]
,因为遍历过程中会再重复计算一次cnt[40]*cnt[20]
,所以答案要除以2
,同时要注意处理0+0==0
和30+30==60
的情况。
时间复杂度分析:$O(n)$
Python3 代码
class Solution:
def numPairsDivisibleBy60(self, time: List[int]) -> int:
nums = [i % 60 for i in time]
cnt = collections.Counter(nums)
# print(cnt)
ans = 0
for k in cnt.keys():
# print(k, cnt[k], cnt[60 - k])
if k == 30 or k == 0:
ans += (cnt[k] * (cnt[k] - 1))
elif 60 - k in cnt.keys():
ans += (cnt[k] * (cnt[60 - k]))
ans //= 2
return ans