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;
}
}