剑指 Offer II 035. 最小时间差
给定一个 24 小时制(小时:分钟 “HH:MM”)的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
示例 1:
输入:timePoints = ["23:59","00:00"]
输出:1
示例 2:
输入:timePoints = ["00:00","23:59","00:00"]
输出:0
提示:
2 <= timePoints <= 2 * 104
timePoints[i] 格式为 "HH:MM"
方法一:时间转换为分钟,两个两个的遍历比较,最后把尾部的数字和头部的数字比较(因为在时间上最后一个数字也是可以走到第一个数字的)
- 使用24 * 60 = 1440大的数组,将所有可能的时间数字存储起来
- 使用string.substring方法,比split方法快一些
- 两个两个的比较数字,拿到最小值
- 最后把第一个数字和最后一个数字作比较,只需要比较跨过0点的部分,另一部分不用比较,因为已经比较过了(两种可能:1、首尾两个数字中间存在其他数字,则已经拿到更小的数字差值;2、首尾之间没有数字,则已经比较过了。)
代码如下:
class Solution {
public int findMinDifference(List<String> timePoints) {
boolean[] time = new boolean[24 * 60];
int size = timePoints.size();
if (size > 24 * 60) return 0;
//将时间转换为分钟数字
for (int i = 0; i < size; i++) {
String str = timePoints.get(i);
int hour = Integer.parseInt(str.substring(0, 2));
int minute = Integer.parseInt(str.substring(3, 5));
int minutes = hour * 60 + minute;
if (time[minutes]) {
return 0;
} else {
time[minutes] = true;
}
}
//开始两个一起遍历
int min = Integer.MAX_VALUE, pre = -1, first = -1;
for (int i = 0; i < time.length; i++) {
if (time[i]) {
if (pre == -1) {
//记录第一个数字
first = i;
pre = i;
} else {
min = Integer.min(min, i - pre);
pre = i;
}
}
}
//最后一个数字和头部数字比较,这里要比较跨过0点的部分即可,因为另一部分已经比较过了。
//最后数字:pre,第一个数字:first
return Integer.min(min, 1440 - pre + first);
}
}
结果: