问题
在歌曲列表中,第i首歌有一个持续time[i]秒。
返回歌曲总时长(秒)可被60整除的歌曲对数。即返回能使time[i]+time[j]能被60整除的i,j对数。
输入: [30,20,150,100,40]
输出: 3
解释: 有三对i,j使得歌曲持续时间之和能被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
解析
这一题用双重循环遍历会超时,而且也没必要。我们由2sum问题想到一种简单的解。首先要想时间之和能被60整除,那么只需要保证它们对60取余后加起来和能被60整除即可。 因此,问题变成了余数部分的匹配。
Java代码
public int numPairsDivisibleBy60(int[] time) {
int count=0;
int mo[] = new int[60];
for(int i=0;i<time.length;i++){
mo[time[i]%60]++;
}
for(int i=0;i<=30;i++){
if(i==30||i==0){
count+=(mo[i]*(mo[i]-1))/2;
}
else{
count+=mo[i]* mo[60-i];
}
}
return count;
}