题目:

给定一个 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)-最小时间差(中等)的更多相关文章

  1. Java实现 LeetCode 539 最小时间差(单位转换)

    539. 最小时间差 给定一个 24 小时制(小时:分钟)的时间列表,找出列表中任意两个时间的最小时间差并已分钟数表示. 示例 1: 输入: ["23:59","00:0 ...

  2. 力扣1438. 绝对差不超过限制的最长连续子数组-C语言实现-中等难度

    题目 传送门 文本 给你一个整数数组 nums ,和一个表示限制的整数 limit,请你返回最长连续子数组的长度,该子数组中的任意两个元素之间的绝对差必须小于或者等于 limit . 如果不存在满足条 ...

  3. 539 Minimum Time Difference 最小时间差

    给定一个 24 小时制(小时:分钟)的时间列表,找出列表中任意两个时间的最小时间差并已分钟数表示.示例 1:输入: ["23:59","00:00"]输出: 1 ...

  4. 力扣1689. 十-二进制数的最少数目-C语言实现-中等难度题

    题目 传送门 如果一个十进制数字不含任何前导零,且每一位上的数字不是 0 就是 1 ,那么该数字就是一个 十-二进制数 .例如,101 和 1100 都是 十-二进制数,而 112 和 3001 不是 ...

  5. 力扣1052. 爱生气的书店老板-C语言实现-中等难度

    题目 传送门 文本 今天,书店老板有一家店打算试营业 customers.length 分钟.每分钟都有一些顾客(customers[i])会进入书店,所有这些顾客都会在那一分钟结束后离开. 在某些时 ...

  6. 力扣算法经典第一题——两数之和(Java两种方式实现)

    一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...

  7. LeetCode-539 最小时间差

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/minimum-time-difference 题目描述 给定一个 24 小时制(小时:分钟 &q ...

  8. 力扣——Next Permutation(下一个排列) python实现

    题目描述: 中文: 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许 ...

  9. 力扣Leetcode 45. 跳跃游戏 II - 贪心思想

    这题是 55.跳跃游戏的升级版 力扣Leetcode 55. 跳跃游戏 给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 你的目标是使用最少的跳跃 ...

  10. 【力扣leetcode】-787. K站中转内最便宜的航班

    题目描述: 有 n 个城市通过一些航班连接.给你一个数组 flights ,其中 flights[i] = [fromi, toi, pricei] ,表示该航班都从城市 fromi 开始,以价格 p ...

随机推荐

  1. 阿里云Python UDP Server和client基础教程

    壹: socket通信是常用的一种通信方式,熟练掌握,快速的入戏,是一个程序员必备的素质. 贰: 注意:udp和tcp的套接字: 服务端代码: #!/usr/bin/env python3 # -*- ...

  2. 基于六轴传感器MPU6050的物体移动监测报警系统

    一 系统简介 1.简介 MPU-60x0 是全球首例 9 轴运动处理传感器.它集成了 3 轴MEMS陀螺仪,3 轴MEMS加速度计,以及一个可扩展的数字运动处理器 DMP(Digital Motion ...

  3. JDK1.8版本java字符串常量池里存的是String对象还是引用?

    转载自http://t.csdn.cn/iD9LD 先下结论:对象! 众所周知,JDK1.8版本中,String常量池已经从方法区中的运行时常量池分离到堆中了,那么在堆中的String常量池里存的是S ...

  4. Linux查看用户的7个命令

    Linux是中国IT实验室的一个技术频道.包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类      在Linux系统里,我们会经常用Linux查看用户的命令,在这里我们一些 ...

  5. JSF之Action 与ActionListener的区别

     事件  检验  参数  事件产生  页面跳转  Action  有 无参数,不传入当前控件,有返回值    当铵钮被单击时产生事件.提交表单   返回页面---根据配置文件跳转  ActionLis ...

  6. NVIDIA Jestson TX2 配置cuda以及cudnn的坑 ( JetPack-L4T 、Error: downloading update lock、TX2,TX1,TK1相关资源信息)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  7. 高校刮起元宇宙风!3DCAT实时云渲染助力川轻化元校园建设

    元宇宙,是一个虚拟的网络世界,它与现实世界相互连接,为人们提供了一个身临其境的数字体验.元宇宙的概念并不新鲜,早在上个世纪就有科幻作家和电影导演对它进行了想象和创造.但是,随着科技的发展,特别是5G. ...

  8. Redis数据库安装与使用总结

    Redis语句总结 一.基本概念 Redis 全称: Remote Dictionary Server(远程字典服务器)的缩写,以字典结构存储数据,并允许其他应用通过TCP协议读写字典中的内容. 使用 ...

  9. 如何理解UDP 和 TCP? 区别? 应用场景?

    一.UDP UDP(User Datagram Protocol),用户数据包协议,是一个简单的面向数据报的通信协议,即对应用层交下来的报文,不合并,不拆分,只是在其上面加上首部后就交给了下面的网络层 ...

  10. NFNet:NF-ResNet的延伸,不用BN的4096超大batch size训练 | 21年论文

    论文认为Batch Normalization并不是网络的必要构造,反而会带来不少问题,于是开始研究Normalizer-Free网络,希望既有相当的性能也能支持大规模训练.论文提出ACG梯度裁剪方法 ...