LeetCode 1013. 总持续时间可被 60 整除的歌曲(C、C++、python)

在歌曲列表中,第 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
                
        

猜你喜欢

转载自blog.csdn.net/qq_27060423/article/details/88670388