在歌曲列表中,第 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
C
int numPairsDivisibleBy60(int* time, int timeSize)
{
int n=timeSize;
int* tmp=(int*)malloc(sizeof(int)*61);
memset(tmp,0,sizeof(int)*61);
for(int i=0;i<n;i++)
{
if(0==time[i]%60)
{
tmp[60]++;
}
else
{
tmp[time[i]%60]++;
}
}
int count=0;
for(int i=1;i<=60;i++)
{
if(30==i || 60==i)
{
if(tmp[i]>1)
{
count+=tmp[i]*(tmp[i]-1)/2;
}
}
else
{
if(tmp[i])
{
if(tmp[60-i])
{
count+=tmp[i]*tmp[60-i];
tmp[60-i]=0;
}
}
}
}
return count;
}
C++
class Solution {
public:
int numPairsDivisibleBy60(vector<int>& time)
{
int count=0;
int n=time.size();
map<int,int> tmp;
for(int i=0;i<n;i++)
{
if(0==time[i]%60)
{
tmp[60]++;
}
else
{
tmp[time[i]%60]++;
}
}
for(auto it:tmp)
{
if(it.second)
{
if(it.first==30)
{
if(it.second>1)
{
count+=(it.second-1)*it.second/2;
}
}
else if(it.first==60)
{
if(it.second>1)
{
count+=(it.second-1)*it.second/2;
}
}
else
{
if(tmp[60-it.first])
{
count+=it.second*tmp[60-it.first];
tmp[60-it.first]=0;
}
}
}
}
return count;
}
};
python
class Solution:
def numPairsDivisibleBy60(self, time: List[int]) -> int:
n=len(time)
dic={}
count=0
for i in range(n):
mod=time[i]%60
if 0==mod:
if 60 not in dic.keys():
dic[60]=0
dic[60]+=1
else:
if mod not in dic.keys():
dic[mod]=0
dic[mod]+=1
for key in dic:
if 30==key or 60==key:
if dic[key]>1:
count+=dic[key]*(dic[key]-1)//2
else:
if dic[key]:
if 60-key in dic.keys():
count+=dic[key]*dic[60-key]
dic[60-key]=0
return count