力扣每日打卡挑战 3184. 构成整天的下标对数目 I
给你一个整数数组 hours,表示以 小时 为单位的时间,返回一个整数,表示满足 i < j 且 hours[i] + hours[j] 构成 整天 的下标对 i, j 的数目。
整天 定义为时间持续时间是 24 小时的 整数倍 。
例如,1 天是 24 小时,2 天是 48 小时,3 天是 72 小时,以此类推
这个题目特别简单,因为数据范围只有100,直接两重循环,完全不存在超时的问题,一个枚举i,一个枚举j,然后判断是否和为24的倍数就可以了。不过因为hours数组的最大值是1e9,还有求和,所以为了保险起见避免爆int,我用了long long
时间复杂度O(n*n), 空间复杂度O(1)。
class Solution {
public:int countCompleteDayPairs(vector<int>& hours) {int len = hours.size();int ret=0;for (int i=0; i<len; i++){for (int j=i+1; j<len; j++){long long ans = hours[i]+hours[j];if (ans % 24 == 0){ret++;}}}return ret;}
};
前面只是上课前赶时间写的,而很明显这个题目应该还有可以优化的地方,平方的复杂度还是有点高了。那么有什么办法可以优化一下呢?可以这样想,我们的i已经确定了,那么要找的j就是固定加起来是24的倍数的。那是不是可以想办法记录一下每个数和哪些数加起来是24的倍数呢。当然可以,给每个数对24取余一下就可以了,而和它组成的24倍数的就是取余后和为24的。这一点应该能够理解。这样就得到了一个改进版的代码了,实际上这也就是哈希了
class Solution {
public:int countCompleteDayPairs(vector<int>& hours) {int len = hours.size();vector<vector<int> > vec(24);for (int i=0; i<len; i++){int mod = hours[i]%24;vec[mod].push_back(hours[i]);}int ans=0;for (int i=1; i<12; i++){ans += (vec[i].size())*(vec[24-i].size());}int mod0 = vec[0].size(), mod12 = vec[12].size();ans += mod0*(mod0-1)/2;ans += mod12*(mod12-1)/2;return ans;}
};
取余为0和取余为12的需要特判一下,因为和它们配对的数的取余值就是自己。
这样就把两重循环变成了一重循环,但增加了一个vec数组用来记录每个数取余后所在的位置。
时间复杂度O(n), 空间复杂度O(n)。
那么,还有办法可以继续优化吗?时间复杂度肯定是降不下去了,毕竟不管怎么改,总得遍历一次吧。但空间复杂度说不定还可以优化一下。
确实可以,我们可以注意到,我们虽然在vec里把每个数都存了起来,但实际上我们并没有用到它们。我们只是用到了数量。那么我们完全可以选择不存这些数,而只记录一下取余后的值的数量。
这样我们就得到了下一版的代码了
class Solution {
public:int countCompleteDayPairs(vector<int>& hours) {int len = hours.size();map<int, int> ma;for (int i=0; i<len; i++){ma[hours[i]%24]++;}int ma0=ma[0], ma12=ma[12];int ans = ma0*(ma0-1)/2;ans += ma12*(ma12-1)/2;for (int i=1; i<12; i++){ans += ma[i]*ma[24-i];}return ans;}
};
思路与之前一致,只是少存了没用的数了,顺便这里的map完全可以用一个数组代替,我只是太久没写代码了,用下map熟悉一下而已
时间复杂度还是O(n),但空间复杂度降到了O(1)。
这应该就是最终版了,至少我想不到其他的优化方法了
翻了下力扣的题解,我又找到了一个优化方法。其实也不算优化吧,因为时空复杂度都不变,只不过也许可能大概常数因子会稍微小一点,因为把乘法换成了加法,也少了一次循环,但多了取余
class Solution {
public:int countCompleteDayPairs(vector<int>& hours) {int ans = 0;int cnt[24];memset(cnt, 0, sizeof(cnt));//也许换成循环会更快一点点?for (int h : hours){int mod = h%24;ans += cnt[(24-mod)%24];cnt[mod]++;}return ans;}
};
特别提醒一句,cnt[(24-mod)%24]里面的取余是必不可少的,不然mod为0的时候就会数组越界了。而且两个加法的顺序也不能换,不然就多算了
相关文章:
力扣每日打卡挑战 3184. 构成整天的下标对数目 I
给你一个整数数组 hours,表示以 小时 为单位的时间,返回一个整数,表示满足 i < j 且 hours[i] hours[j] 构成 整天 的下标对 i, j 的数目。 整天 定义为时间持续时间是 24 小时的 整数倍 。 例如,1 天是 24 小时,…...
The First:Starknet如何让以太坊更快更安全?
随着区块链技术需求的持续增长,当前技术在可扩展性和隐私保护方面的局限性愈发凸显,以太坊网络便是其中的典型代表。为有效应对这些挑战,第二层扩展解决方案的重要性日益凸显。这些方案旨在将部分交易处理转移至以太坊主链之外,以…...
【计算机网络 - 基础问题】每日 3 题(五十三)
✍个人博客:https://blog.csdn.net/Newin2020?typeblog 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞…...
便携式移动消防炮:灵活灭火新选择
在当今快速发展的社会中,火灾安全问题一直是公众安全的重要组成部分。无论是家庭、办公场所还是大型工业区,火灾的发生都可能带来不可预测的巨大损失,传统消防固定系统往往无法迅速适应多变的火场环境,特别是对于那些发生在高层建…...
18.VScode写Java项目的教程
VScode写Java项目的教程 1.首先必选先安装Java解释器2.安装插件Java Extension Pack3.创建项目创建项目结构选择项目类型 4.测试结果源码内容 今天用一台老式笔记本写代码,IDEA跑不动就准备用VScode突然间就蒙了,怎么创建项目啊?于是就有了这…...
本地生活便民信息服务小程序源码系统 PHP+MySQL组合开发 带完整的安装代码包以及搭建部署教程
系统概述 地方门户分类信息网站源码系统是一个基于PHP和MySQL开发的强大平台,旨在帮助用户轻松搭建地方性的分类信息网站。该系统集成了众多实用功能,支持用户自由发帖、浏览和搜索各类信息,如二手交易、求职招聘、房屋租售、生活服务、商家…...
Java项目实战II基于微信小程序的原创音乐平台{UNIAPP+SSM+MySQL+Vue}(开发文档+数据库+源码)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在数字音乐…...
【个人同步与备份】电脑(Windows)与手机/平板(Android)之间文件同步
文章目录 1. syncthing软件下载2. syncthing的使用2.1. 添加设备2.1.1. syncthing具备设备发现功能,因此安装好软件,只需确认设备信息是否对应即可2.1.2. 如果没有发现到,可以通过设备ID连接2.1.3. 设置GUI身份验证用户,让无关设备…...
代码随想录算法训练营第46期Day37,38,39,41
这几天晚上看比赛,就把刷题耽误了。还好是开新章节,前面的题都比较简单。 然后周天做完了又忘记发了 动态规划 确定dp数组(dp table)以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数 Day37前两道题太简单…...
点跟踪论文—RAFT: Recurrent All-Pairs Field Transforms for Optical Flow-递归的全对场光流变换
点目标跟踪论文—RAFT: Recurrent All-Pairs Field Transforms for Optical Flow-递归的全对场光流变换 读论文RAFT密集光流跟踪的笔记 RAFT是一种新的光流深度网络结构,由于需要基于点去做目标的跟踪,因此也是阅读了像素级别跟踪的一篇ECCV 2020的经典…...
jmeter学习(6)逻辑控制器-循环
循环执行 1、循环读取csv文件的值 2、foreach 读取变量,变量数字后缀有序递增,通过counter实现 ${__V(typeId${typeIdNum})} beansell断言 String typeIdNum vars.get("typeIdNum"); String response prev.getResponseDataAsString(); …...
unity学习笔记-安装与部署
unity学习笔记-安装与部署 unity & visual studio下载unityvisual studio 创建工程项目内的布局介绍初始化项目各目录介绍1. 场景视图(Scene)2. 游戏视图(Game)3. 层次结构视图(Hierarchy)4. 检查器视图…...
Django+MySQL接口开发完全指南
前言 本文将详细介绍如何使用Django结合MySQL数据库开发RESTful API接口。我们将从环境搭建开始,一步步实现一个完整的接口项目。 环境准备 首先需要安装以下组件: Python 3.8Django 4.2MySQL 8.0mysqlclientdjangorestframework 安装命令 # 创建虚…...
CentOS7上下载安装 Docker Compose
Docker Compose简要介绍(想直接看安装步骤的请跳转到[必要的安装步骤]) Docker Compose 是一个用于定义和管理多容器 Docker 应用的工具,它可以通过一个简单的 YAML 文件(docker-compose.yml)来配置应用程序的服务、网…...
虚拟机的 NAT 模式 或 Bridged 模式能够被外界IPping通
如果虚拟机使用的是 NAT 模式 或 Bridged 模式,通常可以让外部网络(例如互联网)访问虚拟机。NAT 和 Bridged 模式的不同之处在于它们如何将虚拟机连接到宿主机和外部网络。以下是这两种模式的详细说明: 1. NAT 模式 在 NAT 模式…...
C# 使用Dll的几种方法举例
使用 DLL(动态链接库)是 C# 开发中常见的任务之一。DLL 文件包含可以在运行时加载的代码和数据,允许程序共享功能和资源,降低程序的内存占用并促进代码的复用。本篇文章将深入探讨 C# 中使用 DLL 的多种方法,并提供相关…...
什么是不同类型的微服务测试?
大家好,我是锋哥。今天分享关于【什么是不同类型的微服务测试?】面试题?希望对大家有帮助; 什么是不同类型的微服务测试? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 微服务架构中的测试可以分为多种类…...
Docker 拉取镜像时配置可用镜像源(包含国内可用镜像源)
在/etc/docker/daemon.json中写入如下内容(如果文件不存在请新建该文件): { "registry-mirrors":["https://registry.docker-cn.com"] } 重新加载 json 配置文件: sudo systemctl daemon-reload重启 docker 服务: sud…...
International Symposium on Artificial Intelligence Innovations
计算机科学(Computer Science): 算法、自动化软件工程、生物信息学和科学计算、计算机辅助设计、计算机动画、计算机体系结构、计算机建模、计算机网络、计算机安全、计算机图形学与图像处理、数据库与数据挖掘、数据压缩、数据加密、数字信号…...
Golang笔记_day10
Go面试题(三) 1、什么是channel,为什么它可以做到线程安全 在Go语言中,channel是一种类型,它可以用来在协程之间传递数据通过共享内存来通信: 通过共享内存来通信是指多个线程或进程直接访问相同的内存区域…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
如何配置一个sql server使得其它用户可以通过excel odbc获取数据
要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据,你需要完成以下配置步骤: ✅ 一、在 SQL Server 端配置(服务器设置) 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到:SQL Server 网络配…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...
