Leetcode第128场周赛 1013. 总持续时间可被 60 整除的歌曲

版权声明:版权归博主所有,转载请注明 https://blog.csdn.net/qq_17808707/article/details/88617773

题目描述

在歌曲列表中,第 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(1/2n^2)。可采用一趟遍历对此问题求解,以空间换时间。
以下为排名第一的大佬的解题思路及代码:
若两个数可以产生配对,则他们的余数之和必为60。由于time的最大值为500,因此可设定上届为大于500的第一个60的倍数,可以选为540,此处为了方便,选择600。
如果一个数对60的余数为20,则与它配对的数对60的余数必然为40。故只需查看余数为40的数的个数,即为配对数目,同时记录余数为20的数的数目。最后统计配对数目总和即可。

代码

class Solution {
public:
    int numPairsDivisibleBy60(vector<int>& time) {
        int s[60],ans=0;
        memset(s,0,sizeof(s));
        for(auto i:time)
        {
            ans+=s[(600-i)%60];
            s[i%60]++;
        }
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_17808707/article/details/88617773