力扣539(java)-最小时间差(中等)
题目:
给定一个 24 小时制(小时:分钟 "HH:MM")的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
示例 1:
输入:timePoints = ["23:59","00:00"]
输出:1
示例 2:
输入:timePoints = ["00:00","23:59","00:00"]
输出:0
提示:
2 <= timePoints.length <= 2 * 104
timePoints[i] 格式为 "HH:MM"
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimum-time-difference
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
鸽巢原理(抽屉原理):一定的鸽子数量分到一定数量的鸽巢中,当鸽子数量大于鸽巢数量时,必然会有鸽子分到一个鸽巢中。
1.根据鸽巢原理,我们计算一天的分钟数为24*60=1440分钟,即当时间数组的长度大于1440时,必然有重复的时间,时间差一定为0;
2.将时间列表中的每个时间都换算成分钟数,得到分钟数组;
3.将分钟数组进行升序排序,最小时间差一定是数组中相邻的两个时间之差,最小值最后再与 最小值+1440-最大值 作比较,取得最小值即为结果。
说明: 最小值+1440-最大值
为了避免出现负数,这里的排序是将所有时间看成是同一天的时间,按照距离 00:00 的分钟数,从小到大排序(想象成一个环),尾时间如23:59和首时间如00:00就会相邻,那么如果不加1440,则(t0Minutes - preMinutes)= 0 -1439 = -1439,那么经过min(min, t0Minutes + 1440 - preMinutes) 之后答案肯定是-1439,而真实是只差一分钟,这里如果把首时间00:00看成第二天的时间,首时间需要加24小时(即 1440 分钟),所以 首时间 - 尾时间 = 24:00(即 1440) - 23:59(即 1439) = 1。当然,这里的首时间(最小的时间)不一定非得是零点几分,尾时间(最大的时间)也不一定是零点之前的某个时间,假如首时间=22:22,尾时间=22:23,尾时间与首时间相邻,这里把 22:22 看成是第二天的时间,首时间 - 尾时间 = 22:22 + 24:00 - 22:23 = 1342 + 1440 - 1343 = 1439 。
代码:
1 class Solution {
2 public int findMinDifference(List<String> timePoints) {
3 int n = timePoints.size();
4 //一天共有1440分钟,如果时间长度>1440,则说明有重复时间
5 if(n > 1440) return 0;
6 int[] arr = new int[n];
7 for(int i = 0; i < n; i++){
8 //计算每个时间的分钟数
9 arr[i] = getMinutes(timePoints.get(i));
10 }
11 Arrays.sort(arr);
12 int min = Integer.MAX_VALUE;
13 for(int i = 1; i < arr.length; i++){
14 //求出最小时间差
15 min = Math.min(min, arr[i] - arr[i - 1]);
16 if(min == 0) return 0;
17 }
18 //消除负数,首时间为第二天的22:22,末时间为22:23,差值为1分钟
19 return Math.min(min, arr[0] + 1440 - arr[arr.length - 1]);
20 }
21 //获取分钟数的函数
22 public int getMinutes(String s){
23 return s.charAt(0)*10*60 + s.charAt(1)*60 + s.charAt(3)*10 + s.charAt(4);
24 }
25 }

小知识:
1.java中length、length()以及size()的用法:
- length:是针对数组,表明统计数组的长度即数组中元素的个数,它是数组的属性不是方法。
1 public static void main(String[] args) {
2 int[] array = new int[]{1,2,3,4,5,6,7,8,9};
3 System.out.println(array.length); // 输出为:9
4 }
- length()方法,常用于字符串,表示包含字符串中所包含字符的个数,char字符没有length()方法。
1 public static void main(String[] args) {
2 String s = "hello";
3 System.out.println(s.length()); // 输出为:5
4 }
- size()方法,用于集合容器(List,Set,Map),表示集合容器中所含元素的个数。
1 public static void main(String[] args) {
2 ArrayList<String> arrayList = new ArrayList<>();
3 arrayList.add("It's");
4 arrayList.add("a");
5 arrayList.add("wonderful");
6 arrayList.add("day");
7 System.out.println(arrayList.size()); // 输出为:4,arraylist中有四个字符串
8 }
参考博客:https://blog.csdn.net/sinat_40380134/article/details/105565530
2.Integer.MAX_VALUE:
对应基本数据类型int的包装类为Integer;
Integer.MAX_VALUE表示int数据类型的最大取值数:2 147 483 647
Integer.MIN_VALUE表示int数据类型的最小取值数:-2 147 483 648
力扣539(java)-最小时间差(中等)的更多相关文章
- Java实现 LeetCode 539 最小时间差(单位转换)
539. 最小时间差 给定一个 24 小时制(小时:分钟)的时间列表,找出列表中任意两个时间的最小时间差并已分钟数表示. 示例 1: 输入: ["23:59","00:0 ...
- 力扣1438. 绝对差不超过限制的最长连续子数组-C语言实现-中等难度
题目 传送门 文本 给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit . 如果不存在满足条 ...
- 539 Minimum Time Difference 最小时间差
给定一个 24 小时制(小时:分钟)的时间列表,找出列表中任意两个时间的最小时间差并已分钟数表示.示例 1:输入: ["23:59","00:00"]输出: 1 ...
- 力扣1689. 十-二进制数的最少数目-C语言实现-中等难度题
题目 传送门 如果一个十进制数字不含任何前导零,且每一位上的数字不是 0 就是 1 ,那么该数字就是一个 十-二进制数 .例如,101 和 1100 都是 十-二进制数,而 112 和 3001 不是 ...
- 力扣1052. 爱生气的书店老板-C语言实现-中等难度
题目 传送门 文本 今天,书店老板有一家店打算试营业 customers.length 分钟.每分钟都有一些顾客(customers[i])会进入书店,所有这些顾客都会在那一分钟结束后离开. 在某些时 ...
- 力扣算法经典第一题——两数之和(Java两种方式实现)
一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...
- LeetCode-539 最小时间差
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/minimum-time-difference 题目描述 给定一个 24 小时制(小时:分钟 &q ...
- 力扣——Next Permutation(下一个排列) python实现
题目描述: 中文: 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许 ...
- 力扣Leetcode 45. 跳跃游戏 II - 贪心思想
这题是 55.跳跃游戏的升级版 力扣Leetcode 55. 跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃 ...
- 【力扣leetcode】-787. K站中转内最便宜的航班
题目描述: 有 n 个城市通过一些航班连接.给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 p ...
随机推荐
- K8s中Labels(标签)和Annotations(注解)对比
在Kubernetes中,Labels(标签)和Annotations(注解)都是用于为资源对象添加元数据的机制,但它们在用途.选择能力以及数据形式上存在一些关键的区别. 首先,Labels主要用于标 ...
- arch安装deep-wine-wechat时,跳过md5检测的方法
yay -S --mflags --skipinteg deepin-wine-wechat 这条命令是的我们跳过了md5检测! 微信的安装位置:C:\Program Files\Tencent\We ...
- Linux查看用户的7个命令
Linux是中国IT实验室的一个技术频道.包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类 在Linux系统里,我们会经常用Linux查看用户的命令,在这里我们一些 ...
- C++ 调用 Python 总结(一)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- 喜报|3DCAT成为国内首批适配Vision Pro内容开发者
近日,苹果在上海总部举办了国内首场 Apple Vision Pro 开发者实验室活动,3DCAT作为国内领先的实时渲染云平台参与了此次活动,成为国内首批适配 Vision Pro 的内容开发者之一. ...
- 【UE虚幻引擎】干货!UE修改分辨率的3种方法
虚幻引擎作为一款实时3D创作工具,在游戏.建筑.影视动画.虚拟仿真等领域受到全球各行各业创作者广泛欢迎,在UE中获取和设置分辨率也是3D创作开发工作中的常用功能.本文介绍了在虚幻引擎中修改分辨率的3种 ...
- 3DCAT首届行业生态交流会|瑞云科技技术总监赵志杰:实时渲染助力元宇宙应用触手可及
2021年12月17日下午,由深圳市瑞云科技有限公司主办,深圳市虚拟现实产业联合会协办的 云XR如何赋能元宇宙--3DCAT实时云渲染首届行业生态合作交流会 圆满落幕.此次活动围绕 "云XR ...
- 记录--实现一个鼠标框选的功能,要怎么实现和设计 api?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 前两年在一家做电商的公司做了一个需求:鼠标框选商品卡片,开始拖拽的时候合成一个然后改变位置,页面上有几千个所以还要结合虚拟列表.当时 ...
- 记录--Object.assign 这算是深拷贝吗
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在JavaScript中,Object.assign() 是一个用于合并对象属性的常见方法.然而,对于许多开发者来说,关于它是否执行深拷贝 ...
- windows系统python3.6(Anaconda3)安装对应版本 torch、torchvision
一.官网下载 .whl 文件 https://download.pytorch.org/whl/torch_stable.html 二.使用pip命令安装 打开你的anaconda,选择对应虚拟环境终 ...