[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
posted @ 2024-10-22 04:55  CNoodle  阅读(8)  评论(0编辑  收藏  举报