[LeetCode] 3184. Count Pairs That Form a Complete Day I
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 小时,以此类推。
说明
这道题的思路二可以直接用来解决 3185 题,与 3184 题是一模一样的。
思路一 暴力解
暴力解法是枚举所有可能的下标对,然后判断是否构成整天。时间复杂度为 O(n^2)。
复杂度
时间O(n^2)
空间O(1)
代码
Java实现
// brute force
class Solution {
public long countCompleteDayPairs(int[] hours) {
int n = hours.length;
long 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 long countCompleteDayPairs(int[] hours) {
int n = hours.length;
int[] map = new int[24];
long count = 0;
for (int h : hours) {
if (h % 24 != 0) {
count += map[24 - h % 24];
} else {
count += map[0];
}
map[h % 24]++;
}
return count;
}
}
相关题目
1010. Pairs of Songs With Total Durations Divisible by 60
2453. Destroy Sequential Targets
3184. Count Pairs That Form a Complete Day I