最小时间差
给定一组范围在00:00至23:59的时间,求任意两个时间之间的最小时间差。例如,输入时间数组[“23:50”,“23:59”,“00:00”],"23:59"和"00:00"之间只有1分钟的间隔,是最小的时间差。
思路
- 题目中要求求分钟的最小时间差,计算得出一天有24*60 = 1440min,因此可以创建一个长度为1440的数组容器当作映射表,并把字符串时间存入数组中:
- 数组下标:一天的分钟数
- 数组的值:是否出现了这个时间
- 接下来只要遍历容器,比较数组值为true的下标,求最小值即可
- 需要注意“00:00”这个时间节点,需要往后遍历而不是到回首位进行差值比较
实现
public class MyFindMinInterval {
public static int findMinDifference(List<String> timePoint) {
//如果超过1440那必须有两个时间点相同,直接返回0即可
if (timePoint.size() > 1440) {
return 0;
}
//创建1441为了兼容第二天的00:00
boolean[] minuteContainer = new boolean[1441];
//遍历时间存入数组
for (String time : timePoint) {
String[] t = time.split(":");
//计算分钟
int min = Integer.parseInt(t[0]) * 60 + Integer.parseInt(t[1]);
//如果存在00:00则直接放入最后一位即可
if (min == 0) {
minuteContainer[1440] = true;
} else {
//否则常规放入固定位置
if (minuteContainer[min]) {
return 0;
}
minuteContainer[min] = true;
}
}
return findMinDifference0(minuteContainer);
}
private static int findMinDifference0(boolean[] minuteContainer) {
//默认min为最大值
int minDiff = minuteContainer.length - 1;
//是否存在上一位,有上一位的下标才能进行计算
int prev = -1;
for (int i = 1; i < minuteContainer.length; i++) {
//如果存在该时间点,则取出对应的下标(分钟)进行计算
if (minuteContainer[i]) {
if (prev >= 0) {
//不断赋值比较取出最小值
minDiff = Math.min(i - prev, minDiff);
}
prev = i;
}
}
return minDiff;
}
}
验证
public static void main(String[] args) {
List<String> timePoints = new ArrayList<>(Arrays.asList("23:50", "20:59", "21:59", "23:59", "00:00"));
List<String> timePoints2 = new ArrayList<>(Arrays.asList("23:50", "20:59", "21:59", "23:59"));
System.out.println(findMinDifference(timePoints)); //1
System.out.println(findMinDifference(timePoints2));//9
}
验证结果没毛病😆