题目:

给定一个 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中数字和字符串和bytes的相互转换实例解析

    一 数字和字符串的相互转换 # int convert string str(12345)) #string convert int int('12345') 二 数字和bytes的相互转换 1.数字 ...

  2. IDEA/Android Studio的gradle控制台输出中文乱码问题解决

    原文地址: IDEA/Android Studio的gradle控制台输出中文乱码问题解决 - Stars-One的杂货小窝 在项目中,有使用到Gradle自定义脚本,会有些输出日志,但是输出中文就变 ...

  3. SVN迁移到Git,并同步提交记录

    原文:SVN迁移到Git,并同步提交记录 - Stars-One的杂货小窝 公司的旧项目存放在SVN,现准备迁移到Git,研究了下,简单记录一下从SVN迁移到Git的操作 步骤 1.创建一个空白文件夹 ...

  4. webserver总结

    可设置参数:连接池最大连接数,最大线程数,任务队列最大值,timeslot epoll epoll监听listen_fd(接受新客户端和断开连接), pipefd(将信号输入到管道用epoll统一管理 ...

  5. Elasticsearch - Docker安装Elasticsearch8.12.2

    前言 最近在学习 ES,所以需要在服务器上装一个单节点的 ES 服务器环境:centos 7.9 安装 下载镜像 目前最新版本是 8.12.2 docker pull docker.elastic.c ...

  6. Linux 文件权限、VIM、防火墙

    Linux 文件权限.VIM.防火墙 目录 Linux 文件权限.VIM.防火墙 SSH连接 环境变量 权限 更改文件所属 更改文件权限 su和sudo 包管理器 VI/VIM iptables防火墙 ...

  7. 记录--前端实现电子签名(web、移动端)通用

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 在现在的时代发展中,从以前的手写签名,逐渐衍生出了电子签名.电子签名和纸质手写签名一样具有法律效应.电子签名目前主要还是在需要个人确 ...

  8. Kafka之Producer网络传输

    一.背景 在Kafka的组成部分(Broker.Consumer.Producer)中,设计理念迥异,每个部分都有自己独特的思考.而把这些部分有机地组织起来,使其成为一个整体的便是「网络传输」.区别于 ...

  9. DevSecOps 中的漏洞管理(上)

    DevSecOps意味着在DevOps交付管道把安全性包含进去.该模型尽可能早地将安全原则集成到软件开发生命周期的所有适用阶段中.下图展示了安全方面在DevOps后期阶段的集成,但DevSecOps安 ...

  10. 关于 ThreadLocalRandom 随机数生成器

    ThreadLocalRandom 线程安全随机数获取. 示例随机整数:java.util.concurrent.ThreadLocalRandom.current().nextInt(); 线程Th ...