题目
给你一个整数数组 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 * 10^5
1 <= hours[i] <= 10^9
答案
我的方法
今天下午看到有个老哥评论,说昨天那个暴力的方法肯定跑不出来,为什么我最后能跑出结果呢?我们要看提示啊,提示告诉了我么hours的长度不一致的,之前那个是100的长度,很小,所以并不影响我们用暴力的解法进行计算,但是这个就不一样了,这个他是500000的长度,太大了,o(n^2)的复杂度并不能满足我们的需求。
今天的思路与官方的思路一致,我也就不在多赘述我的思路啦,我把官方的思路放到这里,然后把我的和官方的代码也附上给大家参考。
PS:其实我是想到了两数和那道题了,所以才这样子做的。
思路与算法
hours[i]+hours[j] 能够被 24 整除,只需 hours[i] 除以 24 的余数与 hours[j] 除以 24 的余数之和能够被 24 整除。
我们可以枚举 hours[i],每一个 hours[i] 对答案的贡献就是能与其成对的 hours[j] 的数量。如果暴力查找能够成对的 hours[j],则每次都需要遍历一遍 hours 数组中剩余的元素。我们可以使用一个长度为 24 的数组 cnt 记录每个余数的出现次数,从而快速查询能够与 hours[i] 成对的元素数量。
注意,哈希表记录的是位于我们当前枚举的 hours[i] 左边的元素,也就是说我们是在枚举右边值的同时维护左边的元素。
我的方法
class Solution:
def countCompleteDayPairs(self, hours: List[int]) -> int:
count=0
a=[0]*24
for i in range(len(hours)):
count += a[(24-hours[i]%24)%24]
a[hours[i]%24] += 1
return count
官方的方法
class Solution:
def countCompleteDayPairs(self, hours: List[int]) -> int:
ans = 0
cnt = [0] * 24
for hour in hours:
ans += cnt[(24 - hour % 24) % 24]
cnt[hour % 24] += 1
return ans
作者:力扣官方题解
这个是链接
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。