1010. Pairs of Songs With Total Durations Divisible by 60*
https://leetcode.com/problems/pairs-of-songs-with-total-durations-divisible-by-60/
题目描述
In a list of songs, the i-th
song has a duration of time[i]
seconds.
Return the number of pairs of songs for which their total duration in seconds is divisible by 60
. Formally, we want the number of indices i < j
with (time[i] + time[j]) % 60 == 0
.
Example 1:
Input: [30,20,150,100,40]
Output: 3
Explanation: Three pairs have a total duration divisible by 60:
(time[0] = 30, time[2] = 150): total duration 180
(time[1] = 20, time[3] = 100): total duration 120
(time[1] = 20, time[4] = 40): total duration 60
Example 2:
Input: [60,60,60]
Output: 3
Explanation: All three pairs have a total duration of 120, which is divisible by 60.
Note:
1 <= time.length <= 60000
1 <= time[i] <= 500
C++ 实现 1
参看 [Java/C++/Python] Two Sum with K = 60, 思路非常详细. 大致如下:
将问题转化为 1. Two Sum*, 目标是对于 time
中的每个元素 t % 60
, 在哈希表中查询是否存在 60 - (t % 60)
. 毕竟我们希望找到 x
使得 (x + t) % 60 == 0
. 然而这里存在一个问题, 由于 t % 60
结果是 0 ~ 59
, 但是 60 - (t % 60)
范围却是 1 ~ 60
. 有两种思路:
- 判断
(60 - (t % 60)) % 60)
在哈希表中存在 - 判断
(600 - t) % 60
是否在哈希表中
class Solution {
public:
int numPairsDivisibleBy60(vector<int>& time) {
unordered_map<int, int> records;
int res = 0;
for (auto &t : time) {
res += records[(600 - t) % 60];
records[t % 60] ++;
}
return res;
}
};
C++ 实现 2
class Solution {
public:
int numPairsDivisibleBy60(vector<int>& time) {
unordered_map<int, int> records;
int res = 0;
for (auto &t : time) {
res += records[(60 - t % 60) % 60];
records[t % 60] ++;
}
return res;
}
};