1010.总持续时间可被 60 整除的歌曲

【LetMeFly】1010.总持续时间可被 60 整除的歌曲

力扣题目链接:https://leetcode.cn/problems/pairs-of-songs-with-total-durations-divisible-by-60/

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

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

 

示例 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

示例 2:

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

 

提示:

  • 1 <= time.length <= 6 * 104
  • 1 <= time[i] <= 500

方法一:取模 + 计数

题目意思是两个数之和是60的整数倍。那么其实我们只需要关系两个数对60取模的余数即可,至于这个数是60的多少倍并不重要。

因此我们可以开辟一个大小为60的整型数组$bin$,数组中每个元素的初始值都是0。$bin[i]$用来记录遍历到当前为止,余数为$i$的歌曲的个数

这样,在遍历过程中,假如当前歌曲时长对60的余数是$j$,那么其需要和$(60-j)%60$组成60的倍数。(这里60-j之和再对60取模主要是为了处理特殊情况:60倍数+60倍数还是60倍数,$0+0=0$)

因此,每次遍历到一首(时长对60取模是j的)歌曲,只需要加上$bin[(60-j)%60]$即可

  • 时间复杂度$O(len(time))$
  • 空间复杂度$O(C)$,其中$C=60$

AC代码

C++

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public:
int numPairsDivisibleBy60(vector<int>& time) {
int bin[60] = {0};
int ans = 0;
for (int t : time) {
ans += bin[(60 - t % 60) % 60];
bin[t % 60]++;
}
return ans;
}
};

Python

1
2
3
4
5
6
7
8
9
10
from typing import List

class Solution:
def numPairsDivisibleBy60(self, time: List[int]) -> int:
bin = [0] * 60
ans = 0
for t in time:
ans += bin[(60 - t % 60) % 60]
bin[t % 60] += 1
return ans

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/130544996


1010.总持续时间可被 60 整除的歌曲
https://blog.letmefly.xyz/2023/05/07/LeetCode 1010.总持续时间可被60整除的歌曲/
作者
Tisfy
发布于
2023年5月7日
许可协议