1. 题目
在歌曲列表中,第 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/pairs-of-songs-with-total-durations-divisible-by-60
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 暴力法,不可取,会超时
class Solution { //暴力,超时代码
public:int numPairsDivisibleBy60(vector<int>& time) {int i, j, sum = 0;for(i = 0; i < time.size()-1; ++i)for(j = i+1; j < time.size(); ++j)if((time[i]+time[j])%60 == 0)sum++;return sum;}
};
- 采用数组,最简单的哈希映射
- 对歌曲求模,歌曲落在0-59的数组内
- 对歌曲数进行排列组合即可
class Solution {
public:int numPairsDivisibleBy60(vector<int>& time) {int t[60] = {0};//求余后的秒数,对应的歌曲数for(int &s : time)t[s%60]++;int ans = 0;ans += t[0]*(t[0]-1)/2 + t[30]*(t[30]-1)/2;//组合数Cn2for(int i = 1; i < 30; ++i){ans += t[i]*t[60-i];}return ans;}
};