leetcode
leetcode 2951 ~ 3000
最小时间差

最小时间差

难度:

标签:

题目描述

English description is not available for the problem. Please switch to Chinese.

代码结果

运行时间: 31 ms, 内存: 17.8 MB


/*
 * 思路:
 * 1. 使用流将时间转换为分钟数。
 * 2. 对时间进行排序。
 * 3. 计算相邻时间的时间差,并记录最小时间差。
 * 4. 需要特别处理首尾时间跨越午夜的情况。
 */

import java.util.*;
import java.util.stream.*;

public class MinimumTimeDifferenceStream {
    public int findMinDifference(List<String> timePoints) {
        List<Integer> minutesList = timePoints.stream()
            .map(time -> {
                String[] parts = time.split(":");
                return Integer.parseInt(parts[0]) * 60 + Integer.parseInt(parts[1]);
            })
            .sorted()
            .collect(Collectors.toList());
        int minDiff = IntStream.range(1, minutesList.size())
            .map(i -> minutesList.get(i) - minutesList.get(i - 1))
            .min()
            .orElse(Integer.MAX_VALUE);
        int firstLastDiff = 1440 + minutesList.get(0) - minutesList.get(minutesList.size() - 1);
        minDiff = Math.min(minDiff, firstLastDiff);
        return minDiff;
    }

    public static void main(String[] args) {
        MinimumTimeDifferenceStream mtd = new MinimumTimeDifferenceStream();
        List<String> timePoints = Arrays.asList("23:59", "00:00");
        System.out.println(mtd.findMinDifference(timePoints)); // 输出 1
    }
}

解释

方法:

这个题解的核心思路是首先将输入的时间列表按照时间顺序排序,然后计算排序后相邻时间点之间的差值,最后还需要检查首尾时间点的差值以处理跨天的情况。考虑到最多只有1440种不同的分钟表示(24小时*60分钟),如果输入的时间点数量超过1440,则必定存在重复,即最小时间差为0。具体步骤为:1. 判断时间点数量是否超过1440,是则直接返回0。2. 将时间点转换为从当天0点开始计算的分钟数,并按分钟数进行排序。3. 遍历排序后的时间点,计算相邻时间点的分钟差,并记录最小差值。4. 计算最后一个时间点与第一个时间点跨天的分钟差,更新最小差值。

时间复杂度:

O(n log n)

空间复杂度:

O(log n)

代码细节讲解

🦆
题解中使用了一个初始的最小差值1440(一天的分钟数)。这种初始化方法是否在所有情况下都是有效的,还是有可能需要调整这个初始值?
在此题解中,初始化最小差值为1440(一整天的分钟数)是有效的,并适用于所有情况。这是因为任何两个不同时间点之间的差值都不可能超过1440分钟,这是因为一天中只有1440分钟。因此,将最小差值初始化为1440是合理的,因为在比较过程中,任何实际出现的时间差都会小于或等于1440,从而确保这个初始值能够被任何两个相邻时间点的实际差值所更新。如果没有时间点差值超过这个初始值,说明所有时间点相同,最小差值实际上应为0,但这种情况在题解的逻辑中已经被提前处理(通过判断时间点数是否超过1440来直接返回0)。

相关问题