3185. 构成整天的下标对数目 II
2024-10-22 10:44:47

Problem: 3185. 构成整天的下标对数目 II

思路

将日期取模映射到24小时,使用哈希表存储时间,并在遍历到每一个时间时,答案加上之前出现的与之构成整天的日期个数,这样就是实现了配对,一次遍历即可。

注意的点

因为我是先做的I再做的II,一开始直接把I的复制过来发现有一个大数组的结果不对。我尝试把ans改成long,但是发现不对最后还是得转回int,也没有用。这才发现原来是返回值应该是long。

然后我一开始使用了哈希表来存储数据,发现时间花销较大。哈希表需要判空操作等,自然花销的常数时间是比较大的。对于键范围已知且为连续整数的取值范围,我们可以直接用数组来作为哈希表存储,这样不仅代码好写,时间效率也有常数级别的较高优化。

复杂度

  • 时间复杂度: $O(n)$
  • 空间复杂度: $O(n)$

Code

1
2
3
4
5
6
7
8
9
10
11
class Solution {
public long countCompleteDayPairs(int[] hours) {
int [] m = new int[24];
long ans = 0;
for(int i = 0; i < hours.length; i++) {
ans += m[(24 - (hours[i] % 24)) % 24];
m[hours[i] % 24]++;
}
return ans;
}
}