首页 > 编程语言 >Leetcode刷题Python之3185.构成整天的下标对数目II

Leetcode刷题Python之3185.构成整天的下标对数目II

时间:2024-10-23 22:52:49浏览次数:3  
标签:24 hours Python count II 3185 数组 余数 remainder

提示:直接暴力求解会超过执行时间,因此要考虑其他方法降低复杂度。

文章目录


问题描述

给定一个整数数组 hours,表示时间,以小时为单位。我们需要找到数组中满足 i < j 且 hours[i] + hours[j] 构成整天(即 24 的倍数)的下标对 i 和 j 的数目。整天可以是 1 天(24 小时),2 天(48 小时),以此类推。


一、示例:

示例 1:

输入: hours = [12,12,30,24,24]
输出: 2
解释:构成整天的下标对分别是 (0, 1) 和 (3, 4)。

输入: hours = [72,48,24,3]
输出: 3
解释:构成整天的下标对分别是 (0, 1)、(0, 2) 和 (1, 2)。


二、解题思路

1. 找余数

我们需要找到满足 hours[i] + hours[j] 是 24 的倍数的下标对。首先,观察到对于任意两个数 hours[i] 和 hours[j],如果它们之和是 24 的倍数,那么 hours[i] % 24 + hours[j] % 24 = 24 或者 hours[i] % 24 + hours[j] % 24 = 0。

因此,可以将每个数对 24 取模,得到一个余数,然后我们只需要找到两个余数之和为 24 的数对,或者两个余数都是 0。

2. 利用哈希表存储余数

为了加快查找配对余数的速度,我们可以使用一个大小为 24 的数组 count 来存储余数出现的频率。通过遍历数组 hours,我们可以计算每个元素对 24 的余数,并存储这些余数出现的次数。

当我们处理到某个 hour 时:

如果 hour % 24 == 0,则表示它可以和之前所有余数为 0 的元素配对。
如果 hour % 24 != 0,则需要寻找数组中是否存在 24 - remainder 这样的余数,它们相加就能构成 24 的倍数。

3. 逐步统计配对数

每次找到一对满足条件的余数时,记录它们的配对次数。最终,返回所有配对的总数即可。

代码实现

class Solution(object):
    def countCompleteDayPairs(self, hours):
        """
        :type hours: List[int]
        :rtype: int
        """
        count = [0] * 24  # 用一个大小为24的数组存储余数的频率
        pairs = 0        
        for hour in hours:
            remainder = hour % 24  # 计算余数
            if remainder == 0:
                # 余数为0的数可以和之前所有余数为0的数配对
                pairs += count[0]
            else:
                # 查找是否存在能够配对的余数
                pairs += count[24 - remainder]
            
            # 更新余数频率
            count[remainder] += 1      
        return pairs

解释代码

1,初始化 count 数组: 我们使用一个大小为 24 的数组 count 来记录每个余数出现的次数。数组索引代表余数,数组的值代表该余数出现的次数。

2,遍历 hours 数组: 对于数组中的每个 hour,我们计算 remainder = hour % 24。
如果余数 remainder == 0,说明这个数可以和之前所有余数为 0 的数配对。于是将 count[0] 加入 pairs 中。如果 remainder != 0,我们需要找是否有 24 - remainder 的余数存在。如果存在,这些余数能够和当前的 hour 配对,所以我们将 count[24 - remainder] 加入 pairs 中。

3,更新频率数组: 无论当前的 remainder 是什么,我们都会将它在 count 数组中的计数加 1,表示这个余数的出现次数。

复杂度分析

时间复杂度: O(n),因为我们只需遍历一次数组,每个元素的余数计算和查找都是 O(1) 操作。
空间复杂度: O(1),因为我们使用了一个固定大小为 24 的数组 count,不依赖于输入数据的大小。
相比使用哈希表存储余数频率,这里我们直接使用数组,因为余数范围固定为 0 到 23,所以数组能够在 O(1) 时间内完成查找和更新,进一步提高了效率。

标签:24,hours,Python,count,II,3185,数组,余数,remainder
From: https://blog.csdn.net/qq_53086905/article/details/143195589

相关文章

  • Python学习的自我理解和想法(20)
    #1024程序员节|征文#学的是b站的课程(千锋教育),跟老师写程序,不是自创的代码!今天是学Python的第20天,学的内容是面向对象中的私有属性,私有方法,多态,单例计模式。开学了,时间不多,写得不多,见谅。目录1.私有属性(1).含义(2).语法(3).演示(4).调用私有属性2.私有方法(1).含义......
  • 12306抢票-python
    写了一整天,代码设置起始站,终点站,出行日期,通过爬虫从12306爬取选择当日的车票信息,保存在csv文件中,随后通过邮箱将包含车次信息的csv文件发送到个人邮箱账号,个人阅读后回发一个邮件,期间包含车次信息,电脑进入邮箱读取邮件,获得所选车次,进行自动化订票,期间需要输入一次验证码,目前是......
  • LeetCode|3185. 构成整天的下标对数目 II(day21)
    作者:MJ昊博客:掘金、CSDN等公众号:程序猿的编程之路今天是昊的算法之路第21天,今天分享的是LeetCode第3185题构成整天的下标对数目II的解题思路。这是一道中等难度的题目,主要考察如何高效地统计两个元素之和为24的倍数的下标对,通过优化的算法减少时间复杂度。题目描......
  • python基于django的校园论坛交流表白墙系统
    目录项目介绍具体实现截图预期达到的目标技术栈编码规范开发技术介绍系统的稳定性和可维护性论文大纲目录核心代码部分展示详细视频演示源码获取方式项目介绍该校园系统主要是来服务与学校内各个职务人员,不管是学生还是老师还是其他在校职工,都可以通过这个平台来进......
  • AtCoder Beginner Contest 375 C题 (python解)
    PanasonicProgrammingContest2024(AtCoderBeginnerContest375)C-SpiralRotation(python解)**原题链接:[(https://atcoder.jp/contests/abc375/tasks/abc375_c)]题目简述:这道题要求对一个NxN的网格进行特定的螺旋旋转操作,而这个N总是偶数。在这里,网格中的每个单元......
  • Python多进程学习与使用:全面指南
    Python多进程学习与使用:全面指南目录引言什么是多进程?为什么使用多进程?Python中的多进程模块:multiprocessing创建进程的基本方法进程间通信进程池多进程与多线程的比较常见问题和解决方案最佳实践和性能优化实战项目:多进程文件处理系统总结引言在当今的计算环境中,充分利......
  • python pdf 转图片
    1.需要安装requests,PyMuPDF依赖pipinstallrequests,PyMuPDF。可以通过定义的缩放因子和旋转因子去缩放图片和旋转。#!/usr/bin/envpython3#-*-coding:utf-8-*-importdatetimeimportosimportrequestsimportfitz#fitz就是pipinstallPyMuPDFheaders......
  • Python——量化交易的得力助手
    在当今的金融领域,量化交易正逐渐成为一种重要的交易方式。而在众多编程语言中,Python似乎成为了量化交易的首选,今天我们总结下在量化交易中Python常用的的库和工具。数据处理与分析1.Pandas:这是一个用于数据处理和分析的强大库。在量化交易中,它可以用来读取、清洗和处......
  • PYTHON处理时间数据
    目录模块简介1.datetime模块2.pandas库操作示例datetime模块pandas处理时间序列dateutil解析时间在Python中处理时间数据,你可以使用标准库中的datetime模块,或者使用第三方库如pandas和dateutil。模块简介在Python中处理时间数据,通常会用到datetime模块和pandas库。以下是......
  • 《Python游戏编程入门》注-第3章2
    《Python游戏编程入门》的“3.2.2获取用户输入”部分介绍了input()函数的用法;“3.2.3异常处理”部分介绍了try...except语句的用法。1input()函数的用法input()函数用于接受用户的输入,该函数的参数可以在等待用户输入之前显示文本。该函数主要有两种用法:第一个是将当前程......