力扣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

posted on 2022-05-25 11:13  我不想一直当菜鸟  阅读(73)  评论(0编辑  收藏  举报