539. 最小时间差
难度中等
一、题目描述
给定一个 24 小时制(小时:分钟 "HH:MM" )的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
二、示例
示例 1:
输入: timePoints = ["23:59","00:00"]
输出: 1
示例 2:
输入: timePoints = ["00:00","23:59","00:00"]
输出: 0
提示:
2 <= timePoints <= 2 * 104timePoints[i]格式为 "HH:MM"
三、分析
依题意,给定包含制定格式("HH:MM")时间的列表,求列表中任意两个时间的最小差值(分钟数表示)。 简要分析,给定为24小时制,则总计有分钟,由 抽屉原理 可知,如果列表长度大于1440,则列表中必定有重复元素,返回0。我们可以先将列表排序,则最小时间差出现的位置有以下两种情况:
- 相邻元素
- 首尾元素 所以,只需排序后遍历列表求出最小相邻元素差,而后与首尾元素差比较即可求的给定列表中任意两时间的最小差值。
复杂度分析:
主要耗费时间操作为集合排序和遍历列表,集合排序所需时间为,遍历所需时间为,所以所需总的时间复杂度为。
四、编码
public int findMinDifference(List<String> timePoints) {
int size = timePoints.size();
if (size > 1440) { return 0; }
int ans = Integer.MAX_VALUE;
//1.将集合排序
Collections.sort(timePoints);
int t0 = getMinutes(timePoints.get(0));
int preMinutes = t0;
//2.求出相邻元素的最小差值
for (int i = 0; i < size; i++) {
int tmpMinutes = getMinutes(timePoints.get(i));
ans = Math.min(ans, tmpMinutes - preMinutes);
preMinutes = tmpMinutes;
}
//3.求出相邻元素最小差值和首尾元素差值之间的最小值
ans = Math.min(ans, t0 + 1440 - preMinutes);
return ans;
}
private int getMinutes(String s) {
return (((s.charAt(0) - '0') * 10 + (s.charAt(1) - '0')) * 60 + (s.charAt(3) - '0') * 10 + (s.charAt(4) - '0'));
}