题目描述:
示例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 整数。
思路:
定义一个int类型的count,初始值为0,用来记录最终的结果
创建一个shuzu数组,长度等于60,每一首"歌曲"的时间对60取余,然后shuzu中对应的的区域的值+1.这样,新数组中每个角标对应的值就是对60取余的数字的个数和。
对于角标从1到30的数组元素,那么只需要count+=shuzu[j]*shuzu[60-j].
但是,对于角标为0和30来说比较特殊,因为0和30他们自身就可以两两成对。所以是count+=(shuzu[0]*(shuzu[0]-1)+shuzu[30]*(shuzu[30]-1))/2,最终结果除2是因为自身成对时有顺序的要求,题中说明一对数字在满足是60的倍数时也要i<j.
java代码
class Solution {
public int numPairsDivisibleBy60(int[] time) {
if(time.length==0||time.length==1){
return 0;
}
int[] shuzu = new int[60];
for(int i=0;i<time.length;i++){
shuzu[time[i]%60]++;
}
int count=0;
for (int i = 1; i < 30; i++) {
count += shuzu[i] * shuzu[60 - i];
}
count += (shuzu[0] * (shuzu[0] - 1) + shuzu[30] * (shuzu[30] - 1)) / 2;
return count;
}
}