In a list of songs, the i
-th song has a duration of time[i]
seconds.
Return the number of pairs of songs for which their total duration in seconds is divisible by 60
. Formally, we want the number of indices i < j
with (time[i] + time[j]) % 60 == 0
.
Example 1:
Input: [30,20,150,100,40] Output: 3 Explanation: Three pairs have a total duration divisible by 60: (time[0] = 30, time[2] = 150): total duration 180 (time[1] = 20, time[3] = 100): total duration 120 (time[1] = 20, time[4] = 40): total duration 60
Example 2:
Input: [60,60,60] Output: 3 Explanation: All three pairs have a total duration of 120, which is divisible by 60.
Note:
1 <= time.length <= 60000
1 <= time[i] <= 500
题意:给出一个整型数组A,问里面存在多少个(Ai,Aj)对,有(Ai+Aj)%60=0且i<j。
我的思路一:
//先求出每个元素%60后的值,然后遍历所有元素,将其补数的个数之和相加,最后除以2(每对都计算了两次)
//这里要注意30与60 (30的补数为自身,对数应该去掉自己的一份;60的要特殊处理)
class Solution {
public:
int num=0,tt=0;
int cnt[65]={0}; //对0到60哈希
int numPairsDivisibleBy60(vector<int>& time) {
for(int i=0;i<time.size();i++){ //储存%60后的值
time[i]%=60;
if(time[i]==0) //60的倍数要进行单独处理
tt++;
cnt[time[i]]++;
}
for(int i=0;i<time.size();i++){
num+=cnt[60-time[i]]; //取60-t[i]的个数
if(time[i]==30) //这里要注意30的时候 减去自身
num--;
}
//printf("%d %d\n",num,tt);
return num/2+tt*(tt-1)/2;
}
};
思路二:
//题目要求存在元素对下标存在i<j的关系
//由i向后找j不好找,我们考虑由j向前找i-- 有:由j处找到的i,比为一个答案对
//要求满足条件的元素对, 且元素对之间存在下标先后关系 -----由后看前!!!
class Solution {
public:
int num=0,tt=0;
int cnt[60]={0};
int numPairsDivisibleBy60(vector<int>& time) {
//要求顺序 要求(A[i],A[j]) i<j 我们看后面的j 着前面与其匹配的i
for(int i=0;i<time.size();i++){
num+=cnt[(60-time[i]%60)%60];
cnt[time[i]%60]++;
}
//printf("%d %d\n",num,tt);
return num;
}
};