题目
类型:数学
解题思路
利用当天最多只有 60 * 24 = 1440 个不同的时间点(跨天的话则是双倍),我们可以使用数组充当哈希表进行计数,同时根据「抽屉原理」,若 timePoints 数量大于 1440,必然有两个相同时间点,用作剪枝。
然后找到间隔最小两个时间点,这种利用「桶排序」的思路避免了对 timePoints 所对应的偏移量进行排序,而 O(C) 的复杂度使得所能处理的数据范围没有上限。
代码
class Solution {
public int findMinDifference(List<String> timePoints) {
int n = timePoints.size();
if (n > 1440) return 0;
int[] cnts = new int[1440 * 2 + 10];
for (String s : timePoints) {
String[] ss = s.split(":");
int h = Integer.parseInt(ss[0]), m = Integer.parseInt(ss[1]);
cnts[h * 60 + m]++;
cnts[h * 60 + m + 1440]++;
}
int ans = 1440, last = -1;
for (int i = 0; i <= 1440 * 2 && ans != 0; i++) {
if (cnts[i] == 0) continue;
if (cnts[i] > 1) ans = 0;
else if (last != -1) ans = Math.min(ans, i - last);
last = i;
}
return ans;
}
}