LC539-最小时间差

152 阅读2分钟

题目名称:最小时间差

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

示例 1:

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

示例 2:

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

提示:

  • 2<=timePoints.length<=21042 <= timePoints.length <= 2 * 10^4
  • timePoints[i] 格式为  "HH:MM"

思路分析

先对原先数组尽心排序,用Collections.sort(),然后在计算相邻的两个字符串的差多少分钟; 最后比较一下ans和 收尾的距离

先判断一下是否长度超过1440,若是超了的话则可以直接确定为0;(因为一天最多就1440分钟) 再将每个时间转换为具体的第几分钟;然后快排排序,判断一下时间间隔即可; 最后需要判断一下最小时间+一天 和 最大时间的差再。 最后返回区间最小即可。

要求找到两个时间差异最小的值,由于是任意两个时间,第一时间想到的粗暴做法是两重循环,但这样明显不好。

首先把时间全都转化为分钟,由于时间是有大小的,排序以后隔一位的差值一定是比相邻的两个时间之间的差值要更大的。 对于一个字符串,先用split方法分割,再用内置的valueOf方法就能快速得到分钟大小。

最后需要判断离第二天最近的时间也就是list的最后一位到第二天时间的差值是否更小即可

直接将所有的时间转换为分钟,然后将这一系列的时间按照从小到大排序,排完序后计算相邻之间的差值,取最小差值 最后不要忘记将第一个数字和最后一个数字比较,先将第一个数字加上24*60分钟再减去最后一个最大的分钟数就是前后的差值

Code实现

public int findMinDifference(List < String > timePoints) {
    if (timePoints.size() > 1440) return 0;
    int[] minutes = new int[timePoints.size()];
    int i = 0;
    for (String time: timePoints) {
        int t = Integer.valueOf(time.substring(0, 2)) * 60 + Integer.valueOf(time.substring(3));
        minutes[i++] = t;
    }
    Arrays.sort(minutes);
    int min = minutes[1] - minutes[0];
    for (int j = 1; j < minutes.length - 1; j++)
        min = Math.min(min, minutes[j + 1] - minutes[j]);
    min = Math.min(min, minutes[0] + 1440 - minutes[minutes.length - 1]);
    return min;
}

结果

Snipaste_2023-04-30_23-02-00.png

算法复杂度分析

  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(n)O(n)