每日一题-最小时间差

164 阅读1分钟

539. 最小时间差

难度中等

一、题目描述

给定一个 24 小时制(小时:分钟  "HH:MM" )的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。

二、示例

示例 1:

输入: timePoints = ["23:59","00:00"]
输出: 1

示例 2:

输入: timePoints = ["00:00","23:59","00:00"]
输出: 0

提示:

  • 2 <= timePoints <= 2 * 104
  • timePoints[i] 格式为  "HH:MM"

三、分析

依题意,给定包含制定格式("HH:MM")时间的列表,求列表中任意两个时间的最小差值(分钟数表示)。 简要分析,给定为24小时制,则总计有24×60=144024\times60=1440分钟,由 抽屉原理 可知,如果列表长度大于1440,则列表中必定有重复元素,返回0。我们可以先将列表排序,则最小时间差出现的位置有以下两种情况:

  • 相邻元素
  • 首尾元素 所以,只需排序后遍历列表求出最小相邻元素差,而后与首尾元素差比较即可求的给定列表中任意两时间的最小差值。

复杂度分析:

主要耗费时间操作为集合排序和遍历列表,集合排序所需时间为O(nlogn)O(nlogn),遍历所需时间为O(n)O(n),所以所需总的时间复杂度为O(nlogn)O(nlogn)

四、编码

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'));
}

题目链接