力扣3185.构成整天的下标对数

server/2024/10/23 7:21:05/

给你一个整数数组 hours,表示以 小时 为单位的时间,返回一个整数,表示满足 i < j 且 hours[i] + hours[j] 构成 整天 的下标对 ij 的数目。

整天 定义为时间持续时间是 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)

class Solution:def countCompleteDayPairs(self, hours: List[int]) -> int:k = 0    # 计数符合条件的对数n = len(hours)# 双重循环检查每对组合for i in range(n):for j in range(i):if (hours[i]+hours[j]%24 == 0):   # 判断是否为24的倍数k++return k

优化

思路:

  1. 两数之和是24的倍数问题可以转化为一个余数相配问题。
  2. 我们可以通过哈希表(计数数组)来记录每个小时数除以24的余数出现的次数。
  3. 如果两个小时数的余数之和为24(或是0,如[0, 0]),那么它们可以配对。

优化算法

  • 维护一个大小为24的数组 remainder_count,用来记录每个余数出现的次数。
  • 遍历 hours,对于每个小时数计算其余数,然后根据当前的已知配对策略进行统计。

举例

借鉴 1. 两数之和 的思路,遍历 hours 的同时,用一个哈希表(或者数组)记录元素的出现次数。

举几个例子:

如果 hours[i]=1,那么需要知道左边有多少个模 24 是 23 的数,这些数加上 1 都是 24 的倍数。
如果 hours[i]=2,那么需要知道左边有多少个模 24 是 22 的数,这些数加上 2 都是 24 的倍数。
如果 hours[i]=26,那么需要知道左边有多少个模 24 是 22 的数,这些数加上 26 都是 24 的倍数。
一般地,对于 hours[i],需要知道左边有多少个模 24 是 24−hours[i]mod24 的数。

特别地,如果 hours[i] 模 24 是 0,那么需要知道左边有多少个模 24 也是 0 的数。

这两种情况可以合并为:累加左边(24−hours[i]mod24)mod24的出现次数。

代码实现时,用一个长为 24 的数组 cnt 维护 hours[i]mod24 的出现次数。

from typing import Listclass Solution:def countCompleteDayPairs(self, hours: List[int]) -> int:remainder_count = [0] * 24  # 记录每个余数的出现次数pairs = 0  # 记录有效配对的数量# 遍历每个小时数for hour in hours:remainder = hour % 24  # 计算余数complement = (24 - remainder) % 24  # 找到配对所需的余数# 如果已经有配对的余数,增加配对数量pairs += remainder_count[complement]# 更新当前余数的计数remainder_count[remainder] += 1return pairs

参考:灵茶山艾府--https://leetcode.cn/problems/count-pairs-that-form-a-complete-day-ii/solutions/2812385/tao-lu-mei-ju-you-wei-hu-zuo-pythonjavac-3vhv/


http://www.ppmy.cn/server/134108.html

相关文章

【Flutter】Dart:库

在 Dart 中&#xff0c;库&#xff08;Library&#xff09;是组织和重用代码的基本方式。通过库&#xff0c;我们可以将代码分割成模块化的部分&#xff0c;方便管理和共享&#xff0c;同时避免命名冲突。Dart 提供了大量内置库&#xff0c;用于支持常见的功能&#xff0c;比如…

Unable to open nested entry ‘********.jar‘ 问题解决

今天把现网版本的task的jar拖回来然后用7-zip打开拖了一个jar进去替换mysql-connector-java-5.1.47.jar 为 mysql-connector-java-5.1.27.jar 启动微服务的时候就报错下面的 Exception in thread "main" java.lang.IllegalStateException: Failed to get nested ar…

商汤科技十周年公布新战略,将无缝集成算力、模型及应用

10月18日&#xff0c;恰逢商汤科技十周年庆典&#xff0c;“2024商汤十周年国际论坛&#xff1a;迈向AI 2.0共融新时代”在香港科学园成功举办。 据「TMT星球」了解&#xff0c;来自全球的行业领袖、政府代表、AI专家共聚于此&#xff0c;共同探讨AI行业的未来。 活动上&…

【电商项目--大数据治理】

电商项目的大数据治理涉及到数据的采集与存储、数据的加工与分析、数据的可视化与应用等方面。以下是一些开展大数据治理工作的建议&#xff1a; 制定数据治理策略&#xff1a;确定数据治理的目标、原则和流程&#xff0c;明确数据的采集、存储、加工和应用等环节的责任和权限&…

算法:KMP算法详解

朴素的BF算法 BF算法即暴力求解字符串匹配的算法 面对这样两个字符串&#xff0c; BF算法就是用两个指针&#xff0c;一个i&#xff0c;一个j&#xff0c;分别从s和t的开始位置开始依次匹配 当遇到s[i] t[0]的时候&#xff0c;此时有可能字符串匹配&#xff0c;需要进行检查…

线性可分支持向量机的原理推导 9-32线性分类超平面的位置 公式解析

本文是将文章《线性可分支持向量机的原理推导》中的公式单独拿出来做一个详细的解析&#xff0c;便于初学者更好的理解。 公式 9-32 是线性可分支持向量机&#xff08;SVM&#xff09;中的一个关键公式&#xff0c;用于表达线性分类超平面的位置。通过这个公式&#xff0c;我们…

Scrapy | Scrapy框架中管道的使用

管道的使用 基本使用如何在管道中区分不同的爬虫 在Scrapy中&#xff0c;爬虫管道&#xff08;Item Pipeline&#xff09;是用于处理Spider提取的数据的一系列组件。它们的主要职责是清洗、验证和存储爬取的数据。每个管道组件是一个Python类&#xff0c;这些类必须定义一个pro…

黑盒测试和白盒测试的具体方法(附加实际应用中的技巧和注意事项)

黑盒测试的具体方法 黑盒测试有多种具体的方法&#xff0c;以下是几种常见的黑盒测试技术&#xff1a; 等价类划分 定义&#xff1a;将输入数据划分为若干等价类&#xff0c;每个等价类中的数据被认为是等效的。目的&#xff1a;减少测试用例数量&#xff0c;同时覆盖所有可…