给你一个整数数组 hours,表示以 小时 为单位的时间,返回一个整数,表示满足 i < j 且 hours[i] + hours[j] 构成 整天 的下标对 i, j 的数目。
整天 定义为时间持续时间是 24 小时的 整数倍 。
例如,1 天是 24 小时,2 天是 48 小时,3 天是 72 小时,以此类推。
示例 1:
输入: hours = [12,12,30,24,24]
输出: 2
解释:
构成整天的下标对分别是 (0, 1) 和 (3, 4)。
示例 2:
输入: hours = [72,48,24,3]
输出: 3
解释:
构成整天的下标对分别是 (0, 1)、(0, 2) 和 (1, 2)。
提示:
1 <= hours.length <= 5 * 1051 <= hours[i] <= 109
解题思路
- 模运算:对于每个
hours[i],计算hours[i] % 24,这样可以将问题转化为寻找两个数的和为 0(模 24)的情况。- 哈希表:使用一个哈希表来记录每个模值出现的次数。这样可以在常数时间内查找和更新模值的计数。
- 遍历数组:遍历数组时,对于每个
hours[i],计算target = (24 - hours[i] % 24) % 24,然后在哈希表中查找target的计数,累加到结果中。最后,更新哈希表中当前模值的计数。
具体实现
function countPairs(hours) {
const modCount = new Map();
let result = 0;
for (const hour of hours) {
// 计算目标模值
const target = (24 - hour % 24) % 24;
// 累加符合条件的对数
result += modCount.get(target) || 0;
// 更新当前模值的计数
modCount.set(hour % 24, (modCount.get(hour % 24) || 0) + 1);
}
return result;
}
// 示例测试
const hours1 = [12, 12, 30, 24, 24];
console.log(countPairs(hours1)); // 输出: 2
const hours2 = [72, 48, 24, 3];
console.log(countPairs(hours2)); // 输出: 3
解释
- 初始化哈希表:
modCount是一个Map对象,用于记录每个模值出现的次数。- 遍历数组:对于每个
hour,计算target = (24 - hour % 24) % 24,这是为了找到与当前hour模 24 后相加为 0 的另一个数。- 累加结果:在哈希表中查找
target的计数,并将其累加到结果中。如果target不存在于哈希表中,则返回 0。- 更新哈希表:更新当前
hour % 24的计数。如果当前模值不存在于哈希表中,则初始化为 0。
时间复杂度
- 时间复杂度:O(n),其中 n 是数组的长度。我们只需要一次遍历数组,并且每次操作都是常数时间。
- 空间复杂度:O(24),即 O(1),因为哈希表中最多只会存储 24 个不同的模值。
这种方法不仅高效,而且简洁,适用于大规模数据的处理。
79

被折叠的 条评论
为什么被折叠?



