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

news/2024/10/23 10:13:27

给你一个整数数组 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 * 105
1 <= hours[i] <= 109

解题思路:
上篇我们已经使用暴力求解的方式得到答案了,今天这题难度升级,暴力解是行不通的,题目要求是24 小时的 整数倍,那么无论任何一个数对24取余就只有0-23的值
这样我们就缩小了范围,再根据取余的结果相加能除以24的就能得到最终的结果

完整代码:/*** 计算完整的白天和黑夜对数* 此方法旨在找出在给定的一组小时中,哪些小时可以组成完整的24小时周期* 这对于分析如工作班次、活动周期等问题可能很有用*      其中 ans += cnt[(24 - hour % 24) % 24];cnt[hour % 24]++;这两场代码做下特殊解释分步解析1.计算 hour % 24:hour % 24:取当前小时 hour 对 24 取模,确保 hour 在 0 到 23 之间。例如,如果 hour 是 25,那么 25 % 24 等于 1。2.计算 (24 - hour % 24) % 24:(24 - hour % 24) % 24:计算与当前小时 hour 组成完整一天的另一个小时。例如,如果 hour 是 1,那么 (24 - 1) % 24 等于 23;如果 hour 是 23,那么 (24 - 23) % 24 等于 1。这个表达式的作用是找到与当前小时 hour 相加等于 24 的另一个小时。例如,如果 hour 是 1,那么需要找到 23 小时才能组成 24 小时。3.访问 cnt 数组:cnt[(24 - hour % 24) % 24]:访问 cnt 数组中对应位置的值。这个值表示之前已经遍历过的小时中,有多少个小时与当前小时 hour 组成完整一天。例如,如果 hour 是 1,那么 cnt[23] 表示之前已经遍历过的小时中有多少个 23 小时。4.累加到 ans:ans += cnt[(24 - hour % 24) % 24]:将 cnt 数组中对应位置的值累加到 ans 中。这表示当前小时 hour 与之前已经遍历过的小时能组成完整一天的对数* @param hours 代表不同时间段的小时数组* @return 返回组成完整24小时周期的小时对数*/public long countCompleteDayPairs(int[] hours) {// 初始化答案变量,用于累计完整的24小时周期对数long ans = 0;// 创建一个长度为24的数组,用于记录每个小时出现的次数int[] cnt = new int[24];// 遍历输入的小时数组for (int hour : hours) {// 计算当前小时与哪个小时可以组成完整的24小时,并累加到答案中// 这里使用模运算来处理跨夜的情况,确保计算结果在0到23之间ans += cnt[(24 - hour % 24) % 24];// 记录当前小时出现的次数cnt[hour % 24]++;}// 返回累计的完整24小时周期对数return ans;}示例:假设 hours 数组为 [1, 23, 23, 1, 23],我们来逐步分析:1.初始状态:ans = 0cnt = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]2.遍历第一个小时 1:hour = 1ans += cnt[(24 - 1) % 24] 即 ans += cnt[23],此时 cnt[23] 为 0,所以 ans 仍为 0。cnt[1]++,cnt 变为 [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]3.遍历第二个小时 23:hour = 23ans += cnt[(24 - 23) % 24] 即 ans += cnt[1],此时 cnt[1] 为 1,所以 ans 变为 1。cnt[23]++,cnt 变为 [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0]4.遍历第三个小时 23:hour = 23ans += cnt[(24 - 23) % 24] 即 ans += cnt[1],此时 cnt[1] 为 1,所以 ans 变为 2。cnt[23]++,cnt 变为 [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0]5.遍历第四个小时 1:hour = 1ans += cnt[(24 - 1) % 24] 即 ans += cnt[23],此时 cnt[23] 为 2,所以 ans 变为 4。cnt[1]++,cnt 变为 [0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0]6.遍历第五个小时 23:hour = 23ans += cnt[(24 - 23) % 24] 即 ans += cnt[1],此时 cnt[1] 为 2,所以 ans 变为 6。cnt[23]++,cnt 变为 [0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0]最终,ans 的值为 6,表示有 6 对小时能组成完整的一天

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/74944.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

使用dbeaver导出数据csv格式要求

1.分隔符改成使用\t, 默认的会导致数字不对2.下面也要修改下,不然会出现列和值对不上情况

通过集成平台实现聚水潭销售出库单与金蝶云星辰V2的无缝对接

PACKAGE-聚水潭销售出库单对接销售出库单-1 在企业信息化系统的集成过程中,数据的高效、准确传输至关重要。本文将分享一个具体的技术案例:如何通过轻易云数据集成平台,将聚水潭奇门的数据无缝对接到金蝶云星辰V2,实现销售出库单的自动化处理。 本次集成方案命名为“PACKAG…

Windows下给Visual Studio添加OpenSSL

一、安装OpenSSL 1.下载OpenSSL Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions可以下载已经编译好的包含 lib 和 include 文件的安装包 有Win32和Win64可选,这里的位数指的是你使用OpenSSL开发出来的软件的位数版本,而不是你计算机的位数。 注意,…

分享一个开源的文件MD5、Hash值等校验的小工具

官方主页 https://github.com/dragonyee/MyHash 软件截图介绍 一款采用并行计算,充分利用多核CPU性能,快速计算文件哈希值的工具。 功能特点: 1、只支持常用的CRC32、MD5、SHA1、SHA256、SHA512算法; 2、支持多核CPU并行计算,大幅提高计算速度; 3、支持多个文件或文件夹拖…

Python 学习记录

前言 简单情况:主要记录学习Python的简单情况,包括代码与结果,以及关键注释 工具与来源: 一下代码与结果都可在JupyterLab上实现,更多情况可看Github使用 NumPy 可视化数学函数 1.可视化 f=x1*e(-x12-x22) import numpy as np import matplotlib.pyplot as pltx1_array=…

OpenPSG:离AGI再进一步,首个开放环境关系预测框架 | ECCV24

全景场景图生成(PSG)的目标是对对象进行分割并识别它们之间的关系,从而实现对图像的结构化理解。以往的方法主要集中于预测预定义的对象和关系类别,因此限制了它们在开放世界场景中的应用。随着大型多模态模型(LMMs)的快速发展,开放集对象检测和分割已经取得了重大进展,…

在外包干了 3 年,被强制清场了。。。

大家好,我是R哥。 今天再分享一个励志的面试辅导案例:一个深圳的兄弟,双非二本,工作 5 年+,在外包干了 3 年,结果今年被甲方强制清场了,没有赔偿,边走劳动仲裁,边学习,最终拿下还不错的自研 offer,脱离外包,太励志了。。在外包干了 3 年,被甲方清场,还没有赔偿,…