《剑指 Offer》专项突破版 - 面试题 35 : 最小时间差(两种方法 + C++ 实现)

目录

前言

一、排序

二、数组


 


前言

题目链接:LCR 035. 最小时间差 - 力扣(LeetCode)

题目

给定一组范围在 00:00 至 23:59 的时间,求任意两个时间之间的最小时间差(以分钟数表示)。例如,输入数组 ["23:50", "23:59", "00:00"],"23:59" 和 "00:00" 之间只有 1 分钟的间隔,是最小的时间差。

分析

这个题目最直观的解法是求出任意两个时间的间隔,然后比较得出最小的时间差。如果输入n个时间,那么这种蛮力法需要 O(n^2) 的时间。


一、排序

上述解法的一个优化方法是把 n 个时间排序。排序之后只需要计算两两相邻的时间之间的间隔,这样就只需要计算 O(n) 个时间差。由于对 n 个时间进行排序通常需要 O(nlogn) 的时间,因此这种优化算法的总体时间复杂度是 O(nlogn)。

这里有一个特殊情况值得注意。如果把输入的时间数组 ["23:50", "23:59", "00:00"] 排序,就可以得到 ["00:00", "23:50", "23:59"]。时间 00:00 和 23:50 之间的间隔是 1430 分钟,而 23:50 和 23:59 之间的间隔是 9 分钟。由于排序之后的第 1 个 00:00 也可能是第 2 天的 00:00,它和前一天的 23:59 之间的间隔只有 1 分钟。也就是说,在计算最小时间差时,需要把排序之后的第 1 个时间当作第 2 天的时间(即加上 24 小时)与最后一个时间之间的间隔也考虑进去

class Solution {
public:int findMinDifference(vector<string>& timePoints) {if (timePoints.size() > 24 * 60)  // 说明存在相同的时间点return 0;
​sort(timePoints.begin(), timePoints.end());int minDiff = INT_MAX;int prevMinute = stoi(timePoints[0].substr(0, 2)) * 60 + stoi(timePoints[0].substr(3));int tmp = prevMinute;for (size_t i = 1; i < timePoints.size(); ++i){int curMinute = stoi(timePoints[i].substr(0, 2)) * 60 + stoi(timePoints[i].substr(3));if (curMinute - prevMinute < minDiff)minDiff = curMinute - prevMinute;
​prevMinute = curMinute;}// 特殊情况if (tmp + 24 * 60 - prevMinute < minDiff)minDiff = tmp + 24 * 60 - prevMinute;
​return minDiff;}
};

 


二、数组

接着思考如何做进一步优化。前面的算法主要将时间花在排序上面,那么排序是否可以避免?排序是为了计算相邻的两个时间的节点,所以用一个表示时间的数组也可以达到这个目的。

一天有 24 小时,即 1440 分钟。如果用一个长度为 1440 的数组表示一天的时间,那么数组下标为 0 的位置对应时间 00:00,下标为 1 的位置对应时间 00:01,以此类推,下标为 1439 的位置对应 23:59。数组中的每个元素是 true 或 false 的标识,表示对应的时间是否存在于输入的时间数组中

有了这个辅助数组,就只需要从头到尾扫描一遍,相邻的两个为 true 的值表示对应的两个时间在输入数组中是相邻的。例如,输入时间数组 ["23:50", "23:59", "00:00"],数组中只有下标为 0、1430 和 1439 这 3 个位置的值为 true,其他位置的值都是 false。

由于数组的下标对应的是时间,因此两个时间之间的时间差就是它们在数组中对应的下标之差。23:50 和 23:59 之间相隔 9 分钟,它们在数组中的下标之差也是 9。

class Solution {
public:int findMinDifference(vector<string>& timePoints) {if (timePoints.size() > 1440)return 0;vector<bool> minuteFlags(1440, false);for (const string& t : timePoints){int minute = stoi(t.substr(0, 2)) * 60 + stoi(t.substr(3));if (minuteFlags[minute])return 0;minuteFlags[minute] = true;}
​int minDiff = INT_MAX;int prevMinute = -1;int firstMinute = INT_MAX;int lastMinute = -1;for (int i = 0; i < 1440; ++i){if (minuteFlags[i]){if (prevMinute >= 0){if (i - prevMinute < minDiff)minDiff = i - prevMinute;}
​prevMinute = i;if (i < firstMinute)firstMinute = i;if (i > lastMinute)lastMinute = i;}}// 特殊情况if (firstMinute + 1440 - lastMinute < minDiff)minDiff = firstMinute + 1440 - lastMinute;return minDiff;}
};

该算法的时间复杂度是 O(n),空间复杂度是 O(1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/672988.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YOLO部署实战(2):使用OpenCV优化视频转图片流程并设置帧数

在计算机视觉和图像处理领域&#xff0c;OpenCV是一个强大的开源库&#xff0c;它为处理图像和视频提供了丰富的工具和功能。本文将介绍如何使用OpenCV将视频文件转换为一系列图片&#xff0c;并演示如何通过设置转换的帧数来优化这一过程。 1 Win10配置OpenCV 在Windows操作…

数据结构与算法之美学习笔记:50 | 索引:如何在海量数据中快速查找某个数据?

目录 前言为什么需要索引&#xff1f;索引的需求定义构建索引常用的数据结构有哪些&#xff1f;总结引申 前言 本节课程思维导图&#xff1a; 在第 48 节中&#xff0c;我们讲了 MySQL 数据库索引的实现原理。MySQL 底层依赖的是 B 树这种数据结构。留言里有同学问我&#xff…

提示由于找不到msvcp120dll无法继续执行此代码怎么办

在计算机系统中&#xff0c;MSVCP120.dll是一个至关重要的动态链接库文件&#xff0c;它是Microsoft Visual C Redistributable Package的一部分&#xff0c;对于许多基于Windows的应用程序运行至关重要。当系统提示“msvcp120dll丢失”时&#xff0c;意味着该文件可能由于误删…

C++之RTTI实现原理

相关系列文章 C无锁队列的原理与实现 如何写出高质量的函数&#xff1f;快来学习这些coding技巧 从C容器中获取存储数据的类型 C之多层 if-else-if 结构优化(一) C之多层 if-else-if 结构优化(二) C之多层 if-else-if 结构优化(三) C之Pimpl惯用法 C之RTTI实现原理 目录 1.引言…

汇编笔记 01

小蒟蒻的汇编自学笔记&#xff0c;如有错误&#xff0c;望不吝赐教 文章目录 笔记编辑器&#xff0c;启动&#xff01;debug功能CS & IPmovaddsub汇编语言寄存器的英文全称中英对照表muldivandor 笔记 编辑器&#xff0c;启动&#xff01; 进入 debug 模式 debug功能 …

vue3-内置组件-KeepAlive

KeepAlive <KeepAlive> 是一个内置组件&#xff0c;它的功能是在多个组件间动态切换时缓存被移除的组件实例。 基本使用 默认情况下&#xff0c;一个组件实例在被替换掉后会被销毁。这会导致它丢失其中所有已变化的状态——当这个组件再一次被显示时&#xff0c;会创建…

【机器学习】机器学习流程之收集数据

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;机器学习 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步…

类与对象(终章)——友元,内部类,匿名对象

这里写目录标题 1. 友元1.2 友元函数1.3 友元类 2. 内部类3.匿名对象 1. 友元 之前实现日期类我们实现输入输出流重载的时候就已经了解了友元的概念&#xff0c;我们今天正式走进友元&#xff0c;详细地学习友元的各种特点与性质。 关键字:friend 1.2 友元函数 友元函数在重载…

【SQL】力扣1571. 仓库经理

1571. 仓库经理 文章目录 【SQL】力扣1571. 仓库经理题目描述输入输出示例示例 1: 解题思路代码与算法步骤解析完整代码 复杂度分析总结 【SQL】力扣1571. 仓库经理 题目描述 本题目来自力扣&#xff08;LeetCode&#xff09;数据库题目集&#xff0c;编号1571&#xff0c;题…

vue3:26—新的内置组件

目录 Teleport Suspense Teleport 什么是Teleport? Teleport 是一种能够将我们的组件html结构移动到指定位置的技术 当在元素中的css使用了filter滤镜属性的时候&#xff0c;会导致内部 fixed 元素定位发生错误&#xff0c;即不再相对 viewport 进行定位&#xff0c;而是相对…

代码随想录day18 Java版

700.二叉搜索树中的搜索 前几天刚对比了下堆和二叉搜索树。堆是上下位置区分大小&#xff0c;二叉搜索树是左右位置区分大小 这道题简单应用了二叉搜索树的查找功能&#xff0c;直接用前序遍历 class Solution {public TreeNode searchBST(TreeNode root, int val) {if (roo…

《山雨欲来-知道创宇 2023 年度 APT 威胁分析总结报告》

下载链接: https://pan.baidu.com/s/1eaIOyTk12d9mcuqDGzMYYQ?pwdzdcy 提取码: zdcy

Django模板(三)

一、标签URL 返回与给定视图和可选参数相匹配的绝对路径引用(不含域名的 URL) {% url some-url-name v1 v2 %} 第一个参数是url模式名称,后面跟着的是参数,以空格分隔可以使用关键字: {% url some-url-name arg1=v1 arg2=v2 %}如果您想检索命名空间的URL,请指定完全限定…

matlab去图像畸变

Input_path ‘C:\Users\Dell\Desktop\毕业设计\去畸变\Image\1’; Output_path‘C:\Users\Dell\Desktop\毕业设计\去畸变\Image\2’; namelist dir(strcat(Input_path,‘*.jpg’)); %获得文件夹下所有的 .jpg图片 len length(namelist); for i1:len namenamelist(i).name; …

Msql-数据库死锁

实验案例 CREATE TABLE t1_deadlock ( id int(11) NOT NULL, name varchar(100) DEFAULT NULL, age int(11) NOT NULL, address varchar(255) DEFAULT NULL, PRIMARY KEY (id), KEY idx_age (age) USING BTREE, KEY idx_name (name) USING BTREE ) ENGINEInnoDB DEFAULT CHARS…

linux安装Webmin

简介 Webmin是功能最强大的基于Web的Unix系统管理工具。管理员通过浏览器访问Webmin的各种管理功能并完成相应的管理动作。Webmin支持绝大多数的Unix系统&#xff0c;这些系统除了各种版本的linux以外还包括&#xff1a;AIX、HPUX、Solaris、Unixware、Irix和FreeBSD等。 安装…

Apollo2.2.0 arm 达梦 人大金仓 适配

基本思路和我之前改的oracle的类似&#xff0c;这里就不赘述了。 Apollo oracle适配_apollo oracle脚本-CSDN博客 目前实现了kingbase8 pgsql兼容模式下适配。达梦 mysql兼容模式下的适配&#xff0c;兼容arm的国产处理器&#xff0c;直接上git链接&#xff0c;有问题私。不同…

百面嵌入式专栏(面试题)内存管理相关面试题1.0

沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们将介绍内存管理相关面试题 。 一、内存管理相关面试题 page数据结构中的_refcount和_mapcount有什么区别?匿名页面和高速缓存页面有什么区别?page数据结构中有一个锁,我们称为页锁,请问trylock_page()和loc…

CAD-autolisp(四)——编译

目录 一、编译1.1 界面操作1.2 生成的应用程序&#xff08;二选一&#xff09; 二、后续学习 一、编译 编译&#xff1a;lsp后缀名为原文件&#xff0c;后缀名为fas、vlx为编译后文件&#xff0c;其会把sld、dcl、lsp等文件都编译进一个应用程序文件中加载&#xff1a;cad命令…

计算机二级C语言的注意事项及相应真题-2-程序修改

目录&#xff1a; 21.计算n!22.将单向链表结点(不包括头结点)数据域为偶数的值累加起来&#xff0c;并且作为函数值返回23.在字符串的最前端加入n个*号&#xff0c;形成新串&#xff0c;并且覆盖原串24.依次取出字符串中所有数字字符&#xff0c;形成新的字符串&#xff0c;并取…