首页 > 其他分享 >3185. 构成整天的下标对数目 II

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

时间:2024-10-23 09:58:24浏览次数:6  
标签:24 cnt 下标 hour 23 II 3185 ans 小时

给你一个整数数组 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 = 0
          cnt = [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 = 1
          ans += 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 = 23
          ans += 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 = 23
          ans += 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 = 1
            ans += 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 = 23
            ans += 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 对小时能组成完整的一天

标签:24,cnt,下标,hour,23,II,3185,ans,小时
From: https://www.cnblogs.com/java-cheng/p/18494546

相关文章

  • Java毕设项目案例实战II 基于移动平台的远程在线诊疗系统(开发文档+数据库+源码)
    目录一、前言二、技术介绍三、系统实现四、论文参考五、核心代码六、源码获取全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末一、前言在当今数字化时代,医疗行业正经历着前所未......
  • 代码随想录算法训练营day22和day23 | 77. 组合 216.组合总和III 17.电话号码的字母
    学习资料:https://programmercarl.com/回溯算法理论基础.html回溯法backtracking:for循环控制递归数量,暴力搜索:组合、切割、子集、排列、棋盘今天学了组合和切割可以画个N叉树的图来帮助理解回溯过程组合又包括1.单个数组(要加startIndex参数)或多个数组;2.数组内有无重复元素;3.数......
  • Day22--下标越界及小结
    Day22--下标越界及小结数组的四个基本特点:长度是确定的,一旦被创建,大小不可改变。元素必须是相同类型,不允许混合类型。元素可以是任何数据类型,包括基本类型和引用类型。在Java中,数组对象在堆中。数组边界数组边界特点如下:下标的合法区间为[0,length-1],如果越界就......
  • 【从零开始的LeetCode-算法】3184. 构成整天的下标对数目 I
    给你一个整数数组 hours,表示以 小时 为单位的时间,返回一个整数,表示满足 i<j 且 hours[i]+hours[j] 构成 整天 的下标对 i, j 的数目。整天 定义为时间持续时间是24小时的 整数倍 。例如,1天是24小时,2天是48小时,3天是72小时,以此类推。示例1:......
  • 代码随想录算法训练营Day42 | 完全背包理论基础、518.零钱兑换II、377. 组合总和 Ⅳ、
    目录完全背包理论基础518.零钱兑换II377.组合总和Ⅳ卡玛网57.爬楼梯(进阶版)完全背包理论基础题目52.携带研究材料(第七期模拟笔试)题目描述:小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间......
  • 使用PIC单片机驱动OLED模块(软件模拟IIC模式)
    @使用PIC单片机驱动OLED模块(软件模拟IIC模式)使用PIC单片机驱动OLED模块(软件模拟IIC模式)最近学习Microchhip的PIC18系列单片机,使用该款单片机进行一些外设的开发。发现网上的资料很少,故开了此个博客,对自己的学习过程进行一些记录,希望未来国内Microchip的社区能有更多的资源......
  • 代码随想录算法训练营第七天|leetcode454.四数相加II、leetcode383. 赎金信 、leetcod
    1leetcode454.四数相加II题目链接:454.四数相加II-力扣(LeetCode)文章链接:代码随想录视频链接:学透哈希表,map使用有技巧!LeetCode:454.四数相加II_哔哩哔哩_bilibili自己的思路:第一反应就是暴力搜索,一层一层for循环来完成,就是会超时1.1自己的代码纯纯暴力搜索classSolutio......
  • windows IIS上部署Vue项目
    1.首先执行build命令打包vue项目npmrunbuild执行打包命令后生成的文件在dist文件夹内  2.新建web.config写入配置代码,放进打包后文件的根目录内https://blog.csdn.net/weixin_41934979/article/details/139711262<?xmlversion="1.0"encoding="UTF-8"?><configuratio......
  • 3184. 构成整天的下标对数目 I
    给你一个整数数组hours,表示以小时为单位的时间,返回一个整数,表示满足i<j且hours[i]+hours[j]构成整天的下标对i,j的数目。整天定义为时间持续时间是24小时的整数倍。例如,1天是24小时,2天是48小时,3天是72小时,以此类推。示例1:输入:hours=[12,12,......
  • IIS配置——关于IIS应用程序池回收机制的几项常用设置
    原文:http://bbs.kuaibiao.cn/thread-5857-1-1.html常规设置对启动模式、发生配置更改时禁止回收、固定时间间隔(分钟)、禁用重叠回收、闲置超时(分钟)这几项做一个说明。快速设置:1、打开IIS,在应用程序池上点击右键选择高级设置。2、常规分组下将启动模式选择为AlwaysRunning......