In a list of songs, the i
-th song has a duration of time[i]
seconds. html
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
.spa
Example 1:code
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:orm
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 arithmetichtm
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 mapblog
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 firstthree
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:get
1 <= time.length <= 60000
1 <= time[i] <= 500