-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpairs-of-songs-with-total-durations-divisible-by-60.js
76 lines (64 loc) · 1.88 KB
/
pairs-of-songs-with-total-durations-divisible-by-60.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/**
* 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.
*/
/**
* @param {number[]} time
* @return {number}
* @time complexity: O(n)
* @space complexity: O(1)
*/
var numPairsDivisibleBy60 = function(time) {
const map = {};
let count = 0;
for (let t of time) {
let remainder = t % 60;
count += map[(60 - remainder) % 60] || 0;
map[remainder] = (map[remainder] || 0) + 1;
}
return count;
};
/**
* @param {number[]} time
* @return {number}
* @time complexity: O(n^2) where n is the size of array time
* @space complexity: O(1)
*/
var numPairsDivisibleBy60Quadratic = function(time) {
let pairs = 0;
for (let i = 0; i < time.length - 1; i++) {
for (let j = i + 1; j < time.length; j++) {
if ((time[i] + time[j]) % 60 === 0) {
pairs++;
}
}
}
return pairs;
};
const assert = require('chai').assert;
describe('Pairs of Songs With Total Durations Divisible by 60', () => {
it('should return 3 when [30,20,150,100,40] is given', () => {
assert.strictEqual(numPairsDivisibleBy60([30,20,150,100,40]), 3);
});
it('should return 3 when [60,60,60] is given', () => {
assert.strictEqual(numPairsDivisibleBy60([60,60,60]), 3);
});
});