最小时间差
难度:
标签:
题目描述
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(一天的分钟数)。这种初始化方法是否在所有情况下都是有效的,还是有可能需要调整这个初始值?
▷