Pairs of Songs With Total Durations Divisible by 60 LT1010

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.

 Idea 1. Similar to Two Sum LT1, map with modular arithmetic

 1 class Solution {
 2     public int numPairsDivisibleBy60(int[] time) {
 3         Map<Integer, Integer> record = new HashMap<>();
 4         int count = 0;
 5         for(int val: time) {
 6             val = val%60;
 7             count += record.getOrDefault((60 - val)%60, 0);
 8             record.put(val, record.getOrDefault(val, 0) + 1);
 9         }
10         
11         return count;
12     }
13 }

array used as map

 1 class Solution {
 2     public int numPairsDivisibleBy60(int[] time) {
 3         int[] record = new int[60];
 4         int count = 0;
 5         for(int val: time) {
 6             val = val%60;
 7             count += record[(60 - val)%60];
 8             ++record[val];
 9         }
10         
11         return count;
12     }
13 }

Idea 1a. count pairs, preprose the array first

 1 class Solution {
 2     public int numPairsDivisibleBy60(int[] time) {
 3         int[] record = new int[60];
 4         for(int val: time) {
 5             val = val%60;
 6             ++record[val];
 7         }
 8         
 9         int count = 0;
10         if(record[0] > 0) {
11             count += record[0] * (record[0]-1)/2;
12         }
13         
14         if(record[30] > 0) {
15             count += record[30] * (record[30]-1)/2;
16         }
17         
18         for(int i = 1; i < 30; ++i) {
19             count += record[i]*record[60-i];
20         }
21         return count;
22     }
23 }

Note:

  1. 1 <= time.length <= 60000
  2. 1 <= time[i] <= 500

猜你喜欢

转载自www.cnblogs.com/taste-it-own-it-love-it/p/10668341.html
60