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; } }
|