{哈希表}[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; }

浙公网安备 33010602011771号