[LeetCode] 3184. Count Pairs That Form a Complete Day I

CNoodle發表於2024-10-22

Given an integer array hours representing times in hours, return an integer denoting the number of pairs i, j where i < j and hours[i] + hours[j] forms a complete day.

A complete day is defined as a time duration that is an exact multiple of 24 hours.

For example, 1 day is 24 hours, 2 days is 48 hours, 3 days is 72 hours, and so on.

Example 1:
Input: hours = [12,12,30,24,24]
Output: 2

Explanation:
The pairs of indices that form a complete day are (0, 1) and (3, 4).

Example 2:
Input: hours = [72,48,24,3]
Output: 3

Explanation:
The pairs of indices that form a complete day are (0, 1), (0, 2), and (1, 2).

Constraints:
1 <= hours.length <= 100
1 <= hours[i] <= 109

構成整天的下標對數目 I。

給你一個整數陣列 hours,表示以 小時 為單位的時間,返回一個整數,表示滿足 i < j 且 hours[i] + hours[j] 構成 整天 的下標對 i, j 的數目。

整天 定義為時間持續時間是 24 小時的 整數倍 。

例如,1 天是 24 小時,2 天是 48 小時,3 天是 72 小時,以此類推。

思路一 暴力解

暴力解法是列舉所有可能的下標對,然後判斷是否構成整天。時間複雜度為 O(n^2)。

複雜度

時間O(n^2)
空間O(1)

程式碼

Java實現

// brute force
class Solution {
    public int countCompleteDayPairs(int[] hours) {
        int n = hours.length;
        int count = 0;
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                int a = hours[i];
                int b = hours[j];
                if ((a + b) % 24 == 0) {
                    count++;
                }
            }
        }
        return count;
    }
}

思路二 - 利用模運算的規則

題目要求我們找的 pair 是 a + b 形成的 hour 是一整天,可以是 24 小時也可以是 48 小時,只要是 24 的倍數即可。同時注意到模運算是有結合律的,即如果 (a + b) % 24 = 0,那麼 a % 24 + b % 24 = 24

所以這裡我們可以用一個長度為 24 的陣列int[] map把所有數字 % 24 後的值統計出來。設當前遍歷到的小時是 hour,那麼我們把它 % 24,即 hour % 24,把它存入 map 中。可以和hour % 24配對的 hour 是 24 - hour % 24。唯一的例外是 24 和 24 的倍數,具體參見程式碼。

複雜度

時間O(n)
空間O(24) - O(1)

程式碼

Java實現

class Solution {
    public int countCompleteDayPairs(int[] hours) {
        int n = hours.length;
        int[] map = new int[24];
        int count = 0;
        for (int h : hours) {
            if (h % 24 != 0) {
                count += map[24 - h % 24];
            } else {
                count += map[0];
            }
            map[h % 24]++;
        }
        return count;
    }
}

相關文章