给定一个 24 小时制(小时:分钟 “HH:MM”)的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
方法一:排序后再计算
思路:首先通过Collection.sort()方法对列表进行排序,然后解析列表中的每一个时间字符串,将其转换为分钟数目,遍历列表计算时间差,最后再次计算表头和表尾的时间差。
注意:初始最小时间差应该定义为一个Integer类型的最大值,我一开始将其定义成了表头,没有考虑到表头是00:00的情况,造成错误。
class Solution {
public int findMinDifference(List<String> timePoints) {
int minMintue = 0;
Collections.sort(timePoints);
int preTime = getMinute(timePoints.get(0));
int minTime = Integer.MAX_VALUE;
for(int i = 1; i < timePoints.size(); i++) {
int curTime = getMinute(timePoints.get(i));
minTime = Math.min(minTime, curTime - preTime);
preTime = curTime;
}
return Math.min(minTime, getMinute(timePoints.get(0)) + 60 * 24 - preTime);
}
private int getMinute(String time) {
return ((time.charAt(0) - '0') * 10 + (time.charAt(1)- '0')) * 60 + (time.charAt(3) - '0') * 10 + (time.charAt(4) - '0');
}
}
方法二:鸽巢原理
在方法一的基础上增加判断,因为时间一共只有24 * 60 = 1440 种不同的可能,所以当时间列表长度大于1440时,此时列表中一定存在重复的时间,可直接返回0
class Solution {
public int findMinDifference(List<String> timePoints) {
if (timePoints.size() > 1440) {
return 0;
}
int minMintue = 0;
Collections.sort(timePoints);
int preTime = getMinute(timePoints.get(0));
int minTime = Integer.MAX_VALUE;
for(int i = 1; i < timePoints.size(); i++) {
int curTime = getMinute(timePoints.get(i));
minTime = Math.min(minTime, curTime - preTime);
preTime = curTime;
}
return Math.min(minTime, getMinute(timePoints.get(0)) + 60 * 24 - preTime);
}
private int getMinute(String time) {
return ((time.charAt(0) - '0') * 10 + (time.charAt(1)- '0')) * 60 + (time.charAt(3) - '0') * 10 + (time.charAt(4) - '0');
}
}