YMLiang

leetcode 1013:总持续时间可被 60 整除的歌曲

在歌曲列表中,第 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
2
3
4
5
6
7
8
9
10
11
12
13
方法1:时间复杂度O(n^2),效率奇低
class Solution {
public int numPairsDivisibleBy60(int[] time) {
int resutl = 0;
for(int i = 0;i<time.length-1;i++){
for (int j = i+1; j < time.length; j++) {
if(time[i]+time[j]%60==0){
result++;
}
}
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
方法2:
利用数组,将每个数对60取模后的值当作新数组的下标,并记录次数
接着遇到连续多个都能整出60的数,则此时 arr[0]的值应该会++多次
若arr[0]=3 即有3个60,他们两两组合则可以组合的数量为(n(n-1))/2 result = (3*2)/2 = 3
同理,取mode后的值为30也是特殊情况,则组合的方法和0的一样,接着下面写就可以了
排除了特殊情况后,正常情况就是20 40, 10 50之类的相加为60的数,这些数2 2 组合直接乘就可以了

class Solution {
public int numPairsDivisibleBy60(int[] time) {
int result = 0;
int[] res = new int[60];
for(int i:time){
res[i%60]++;
}
result += (res[0] * (res[0]-1))/2;
result += (res[30] * (res[30]-1))/2;
//正常情况,相加为60证明一定能被60整除
for(int i = 1;i<30;i++){
result += (res[i] * res[60-i]);
}
return result;
}
}

 评论


博客内容遵循 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议

本站使用 Material X 作为主题 , 总访问量为 次 。
Copyright 2018-2019 YMLiang'BLOG   |   京ICP备 - 19039949  |  载入天数...载入时分秒...