使用C++解决这个问题:1010. 总持续时间可被 60 整除的歌曲 提示 中等 272 相关企业 在歌曲列表中,第 i 首歌曲的持续时间为 time[i] 秒。 返回其总持续时间(以秒为单位)可被 60 整除的歌曲对的数量。形式上,我们希望下标数字 i 和 j 满足 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 通过次数 41.9K 提交次数 84.3K 通过率 49.7%
时间: 2024-01-21 09:01:50 浏览: 19
好的,这是一个很有趣的问题!这里给出一个 C++ 的解法,时间复杂度为 O(n),其中 n 是歌曲的数量。
思路是使用哈希表/桶来记录每个时长出现的次数,然后遍历哈希表/桶,找出可组成总持续时间可被 60 整除的歌曲对的数量。
具体实现如下:
```c++
class Solution {
public:
int numPairsDivisibleBy60(vector<int>& time) {
int res = 0;
vector<int> counts(60, 0);
for (int t : time) {
++counts[t % 60];
}
for (int i = 1; i < 30; ++i) {
res += counts[i] * counts[60 - i];
}
res += counts[0] * (counts[0] - 1) / 2;
res += counts[30] * (counts[30] - 1) / 2;
return res;
}
};
```
首先,我们创建一个长度为 60 的数组 counts,用于记录每个时长出现的次数,初始值全部为 0。
然后,我们遍历输入数组 time,对于每个时长 t,我们将 counts[t % 60] 的值加 1。
接下来,我们遍历 counts,对于 1 ≤ i < 30 的 i,我们计算 counts[i] 与 counts[60 - i] 的积,表示可组成总持续时间可被 60 整除的歌曲对的数量。注意,我们只需要遍历 1 ≤ i < 30 的 i,因为当 i = 0 或 i = 30 时,由于 t % 60 的值只能是 0 或 30,因此它们只能与自己组成歌曲对,需要特殊处理。
最后,我们将 counts[0] 和 counts[30] 的值分别代入组合公式,计算出可组成总持续时间可被 60 整除的歌曲对的数量,并将它们加到 res 中,最终返回 res。