1010. Pairs of Songs With Total Durations Divisible by 60

1010. 总持续时间可被 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. 1 <= time.length <= 60000
  2. 1 <= time[i] <= 500

解法一

//时间复杂度O(n), 空间复杂度O(1)
class Solution {
public:
    int numPairsDivisibleBy60(vector& time) {
        vector rec(60, 0);
        for(int sec : time) rec[sec % 60]++;
        
        int res = rec[0] * (rec[0] - 1) / 2 + rec[30] * (rec[30] - 1) / 2;
        for(int i = 1; i < 30; i++) {
            res += rec[i] * rec[60 - i];
        }
        return res;
    }
};

思路:

笨办法就是穷举所有对,判断其和能否整除60。

由于秒数是整数,所以歌曲的秒数对60取余最多有60种结果(0~59),使用一个数组rec记录其个数,rec[i]代表余数为i的歌曲的数量。使用res记录题目要求的对数。

  1. 首先进行一次遍历,全部完成后,rec中保存了“余数-计数”信息;
  2. 对于歌曲对{ rec[i], rec[60-i] }(0
  3. 对于i = 0和i = 30的情况,只需要自己与自己组合,组合对数为n(n-1)/2,将其加入res。
  4. 返回res,求解完成。
2019/09/02 13:40

你可能感兴趣的:(leetcode笔记)