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