这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战
最小时间差
该题出自力扣的539题——最小时间差(中等题)
审题
给定一个 24 小时制(小时:分钟 "HH:MM")的时间列表, 找出列表中任意两个时间的最小时间差并以分钟数表示。 输入:timePoints = ["23:59","00:00"] 输出:1
-
题目含义相对简单,就是给出一个字符串集合,集合内存放指定格式的时间字符串,找出其中相差最短的时间,返回分钟为单位。
-
初看题意相对还是比较简单的,就算用暴力循环也能冲出来。
-
题解:
- 定义一个存放分钟的整型数组
- 循环给定的集合,并且对字符串分割转换为分钟,存进整型数组
- 对数组进行排序,方便对于计算最小值
- 循环数组,用Math.min方法拿到最小值
- 因为时间是一个循环,00:00其实也是24:00,所以return也要做一个Math.min对数组的首尾,这也是上述排序的好处。
编码
public static int findMinDifference(List<String> timePoints) {
int[] arr = new int[timePoints.size()];
for (int i = 0; i < arr.length; i++) {
String[] time = timePoints.get(i).split(":");
if (time[0] .equals( "00" )&& time[1] .equals( "00")){
arr[i] = 1440;
}else {
arr[i] = Integer.valueOf(time[0]) * 60 + Integer.valueOf(time[1]);
}
}
Arrays.sort(arr);
Integer min = Integer.MAX_VALUE;
for (int i = 1; i < arr.length; i++) {
min = Math.min(min, arr[i] - arr[i - 1]);
}
return Math.min(min, arr[0] + 1440 - arr[arr.length - 1]);
}
彩蛋篇
- 当前的做法,其实时间复杂度和空间复杂度会相对偏高,转换需要一个for循环;排序sort方法底层需要nLog;最后比较也需要一个for循环;取最高也就是sort方法的nLogn。
- 空间复杂度也是取自sort方法的入栈。
- 但是相对测试用例来说,还是有办法优化的,不过仅仅是面向测试用例。(感谢评论区,简直是有趣)
- 至于为什么呢,是因为鸽巢原理 —— 如果集合的长度 > 1440,也就是每个时间段都会存在且必然会有两个相同的时间,此时可以直接返回 0。
- 在首行添加代码
if (timePoints.size() > 1440) { return 0; }