题目

类型:数学

image.png

解题思路

利用当天最多只有 60 * 24 = 1440 个不同的时间点(跨天的话则是双倍),我们可以使用数组充当哈希表进行计数,同时根据「抽屉原理」,若 timePoints 数量大于 1440,必然有两个相同时间点,用作剪枝。
然后找到间隔最小两个时间点,这种利用「桶排序」的思路避免了对 timePoints 所对应的偏移量进行排序,而 O(C) 的复杂度使得所能处理的数据范围没有上限。

代码

  1. class Solution {
  2. public int findMinDifference(List<String> timePoints) {
  3. int n = timePoints.size();
  4. if (n > 1440) return 0;
  5. int[] cnts = new int[1440 * 2 + 10];
  6. for (String s : timePoints) {
  7. String[] ss = s.split(":");
  8. int h = Integer.parseInt(ss[0]), m = Integer.parseInt(ss[1]);
  9. cnts[h * 60 + m]++;
  10. cnts[h * 60 + m + 1440]++;
  11. }
  12. int ans = 1440, last = -1;
  13. for (int i = 0; i <= 1440 * 2 && ans != 0; i++) {
  14. if (cnts[i] == 0) continue;
  15. if (cnts[i] > 1) ans = 0;
  16. else if (last != -1) ans = Math.min(ans, i - last);
  17. last = i;
  18. }
  19. return ans;
  20. }
  21. }