{哈希表}[LeetCode]总持续时间可被60整除的歌曲

题目描述

  在歌曲列表中,第 i 首歌曲的持续时间为 time[i] 秒。

  返回其总持续时间(以秒为单位)可被 60 整除的歌曲对的数量。形式上,我们希望索引的数字 i 和 j 满足  i < j 且有 (time[i] + time[j]) % 60 == 0。

输出示例

  输入:[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

题解

  这道题,第一眼看上去就像是一个双循环的题,分别遍历第一首和第二首歌即可,但是时间复杂度太大O(n^2),当测试数据过大,容易导致超时。所以我选用简单哈希表,将对60取余相等的数插入哈希表中,减少同类数据的重复遍历。

  同时,为了保证i<j,在每次遍历哈希表时,对对应的元素减一。由于当余数为0时,没有匹配的余数,所以要单独考虑。

哈希表的建立
    int ans=0;
    int store[60]={0};
    for(int i=0;i<timeSize;i++)
    {
        time[i]%=60;
        store[time[i]]++;
    }

  实现思路是,将每个元素取余,余数相同的个数存进哈希表中,然后遍历,取余数之和为60的元素个数,加到ans中。

遍历结构

for(int i=0;i<timeSize-1;i++)
    {
        store[time[i]]--;
        if(time[i]==0)
        {
            ans+=store[time[i]];
        }
        else
        {
            ans+=store[60-time[i]];
        }
    }

完整代码

int numPairsDivisibleBy60(int* time, int timeSize){
    int ans=0;
    int store[60]={0};
    for(int i=0;i<timeSize;i++)
    {
        time[i]%=60;
        store[time[i]]++;
    }
    for(int i=0;i<timeSize-1;i++)
    {
        store[time[i]]--;
        if(time[i]==0)
        {
            ans+=store[time[i]];
        }
        else
        {
            ans+=store[60-time[i]];
        }
    }

    return ans;
}

 

posted @ 2020-05-16 11:36  问夏summer  阅读(121)  评论(0)    收藏  举报