Leetcode第128场周赛 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 <= time.length <= 60000
- 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; } };
上一篇:
多线程四大经典案例