当前位置: 首页 > article >正文

LeetCode 3185.构成整天的下标对数目 II:哈希表

【LetMeFly】3185.构成整天的下标对数目 II:哈希表

力扣题目链接:https://leetcode.cn/problems/count-pairs-that-form-a-complete-day-ii/

给你一个整数数组 hours,表示以 小时 为单位的时间,返回一个整数,表示满足 i < jhours[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的哈希表,分别记录小时数模24后的结果数量。

方法一: 遍历一遍得到哈希表, 0 0 0 0 0 0是一对, 12 12 12 12 12 12是一对,其他 i i i 24 − i 24-i 24i是一对。遍历哈希表得到答案数量。

方法二: 遍历过程中,假设这个数对 24 24 24取模后的结果为 k k k,则将答案数量加上 哈希表 [ ( 24 − k ) % 24 ] 哈希表[(24 - k) \% 24] 哈希表[(24k)%24]

  • 时间复杂度 O ( l e n ( h o u r s ) ) O(len(hours)) O(len(hours))
  • 空间复杂度 O ( 1 ) O(1) O(1)

AC代码

C++
/*
0 0
1 23
2 22
...
11 13
12 12
*/
typedef long long ll;
class Solution {
public:
    ll countCompleteDayPairs(vector<int>& hours) {
        ll bin[24] = {0};
        for (int t : hours) {
            bin[t % 24]++;
        }
        ll ans = bin[0] * (bin[0] - 1) / 2 + bin[12] * (bin[12] - 1) / 2;
        for (int i = 1; i < 12; i++) {
            ans += bin[i] * bin[24 - i];
        }
        return ans;
    }
};
Go
package main

func countCompleteDayPairs(hours []int) int64 {
    bin := make([]int64, 24)
    var ans int64
    for _, t := range hours {
        ans += bin[(24 - t % 24) % 24]
        bin[t % 24]++
    }
    return ans
}
Java
class Solution {
    public long countCompleteDayPairs(int[] hours) {
        long[] bin = new long[24];
        for (int t : hours) {
            bin[t % 24]++;
        }
        long ans = bin[0] * (bin[0] - 1) / 2 + bin[12] * (bin[12] - 1) / 2;
        for (int i = 1; i < 12; i++) {
            ans += bin[i] * bin[24 - i];
        }
        return ans;
    }
}
Python
from typing import List

class Solution:
    def countCompleteDayPairs(self, hours: List[int]) -> int:
        bin = [0] * 24
        for t in hours:
            bin[t % 24] += 1
        ans = bin[0] * (bin[0] - 1) // 2 + bin[12] * (bin[12] - 1) // 2
        for i in range(1, 12):
            ans += bin[i] * bin[24 - i]
        return ans

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

Tisfy:https://letmefly.blog.csdn.net/article/details/143196224


http://www.kler.cn/news/367624.html

相关文章:

  • OpenStack将运行的系统导出 QCOW2 镜像并导入阿里云
  • Stable Diffusion视频插件Ebsynth Utility使用方法
  • qt EventFilter用途详解
  • 通过js控制css变量
  • 2024高等代数【南昌大学】
  • FPGA 小鸟避障游戏
  • [Ansible实践笔记]自动化运维工具Ansible(二):Ansible的playbook及角色
  • AudioSetCaps数据集:包含190万对来自AudioSet录音的音频-字幕对。
  • HTTP协议相关知识点
  • 网络编程_day3
  • Flutter 鸿蒙next中的路由使用详解【基础使用】
  • 团结引擎内置 AI 助手团结 Muse Chat 测试版上线!新功能怎么用?能做什么?
  • 技术周总结 10.21~10.27周日
  • LeetCode刷题日记之动态规划(一)
  • 2025前端面试-内存泄露-001
  • k8s 1.21.1部署过程中calico服务启动失败问题
  • LeetCode_1688. 比赛中的配对次数_java
  • LabVIEW提高开发效率技巧----事件日志记录
  • LExecutor: Learning-Guided Execution——论文笔记
  • 爬虫中代理ip 的选择和使用实战
  • Solon浅体验
  • 在虚拟机中编译imx6ull开发板的字符驱动文件报错关于freetype的问题
  • JSON格式及jackson.jar包的安装与配置
  • 科技赋能:在AIGC的道路上找到自己的领域
  • C# LINQ语法学习
  • XxlJob迁移SnailJob工具来了