LeetCode 539. Minimum Time Difference
LeetCode 539. Minimum Time Difference(最小时间差)
题目
链接
https://leetcode-cn.com/problems/minimum-time-difference/
问题描述
给定一个 24 小时制(小时:分钟 "HH:MM" )的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
示例
输入:timePoints = ["23:59","00:00"]
输出:1
提示
2 <= timePoints.length <= 2 * 104
timePoints[i] 格式为 "HH:MM"
思路
二十四小时制,但是需要考虑相隔一天的情况,所以这里增加24小时,当48小时算。
首先用鸽巢原理,一天只有24小时,1440分钟,如果超过这个数量,就代表一定有重复时间。
然后建立数组,2*1440,把每个时间转成分钟之后存放,当天和第二天都存放一遍。
之后对于这个数据进行遍历,主要是三种情况。
- 如果数等于0,就不存在该分钟的时间。
- 如果数大于1,就代表相隔0分钟,直接输出。
- 数等于1,就可以记录和上一个1的差值,这是一个时间间隔数,ans是最小时间间隔。
输出答案即可。
复杂度分析
时间复杂度 O(n)
空间复杂度 O(1)
代码
Java
public int findMinDifference(List<String> timePoints) {
int n = timePoints.size();
if (n > 1440) {
return 0;
}
int[] day = new int[1440 * 2 + 10];
for (String s : timePoints) {
String[] time = s.split(":");
int minute = Integer.parseInt(time[0]) * 60 + Integer.parseInt(time[1]);
day[minute]++;
day[minute + 1440]++;
}
int ans = 1440, last_1 = -1;
for (int i = 0; i < 2880; i++) {
if (day[i] == 0) {
continue;
}
if (day[i] > 1) {
ans = 0;
return ans;
} else if (last_1 != -1) { // now the day[i] = 1
ans = Math.min(ans, i - last_1);
}
last_1 = i;
}
return ans;
}