[leetcode #1010] Pairs of Songs With Total Durations Divisible by 60


Problem


You are given a list of songs where the ith 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 such that i < j with (time[i] + time[j]) % 60 == 0.
Example 1:
Input: time = [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: time = [60,60,60]
Output: 3
Explanation: All three pairs have a total duration of 120, which is divisible by 60.
Constraints:
・ 1 <= time.length <= 6 * 10⁴
・ 1 <= time[i] <= 500

Idea


2曲の再生時間と分単位の個数を計算する問題です.
まず、再生時間の和を分単位にするには、60を0または60で割る.そのため、最初に与えられた再生時間を中心に残りの60点を1回ずつ点数化する.
残数が0または30の場合を除き、現在残数がiの場合、現在の数と残数が(60−i)の個数を乗算すると、可能な数となる.
残りが0または30の場合、n個の数から2個抽出されるので、n*(n−1)/2は数となる.
可能な場合は、総数を合わせて車に戻ればいいです.
Time Complexity: O(n)

Solution

class Solution {
    public int numPairsDivisibleBy60(int[] time) {
        int[] cnt = new int[60];

        for (int duration : time) {
            cnt[duration % 60]++;
        }

        int res = 0;
        for (int i=1; i < 30; i++) {
            res += cnt[i] * cnt[60-i];
        }
        res += cnt[0] * (cnt[0] - 1)  / 2;
        res += cnt[30] * (cnt[30] - 1)  / 2;

        return res;
    }
}
結果はよかった!

Reference


https://leetcode.com/problems/pairs-of-songs-with-total-durations-divisible-by-60/