class Solution {
//解法一:首先分析题目的要点,我们要找出最小的时间差其实很简单,最直观的做法就是使用双重循环计算出每两个时间的时间差,记录下来最小的,但是这种解法时间复杂度为O(n平方)
//解法二:退而求其次我们使用Arrays中的sort函数重写排序规则来对本数组进行排序,这时只需要寻找每个相邻元素之间的最小值,这样只需要扫描数组一次就可以求出最小的差值,这样做的时间复杂度为O(nlogn),已经对上面一种做法有所优化
//解法三:但是我们既然可以通过排序来的到一个顺序的数组,我们可不可以使用不排序切之间复杂度更少的方式来解决这个问题呢,当然可以。每天的分钟数也就只有1440,我们使用一个数组来模拟hash表,key为当前时间对应的分钟数使用数组的下标来表示,value则表示当前的时间是否存在数组中。这样我们相当于也得到了如同上面一个排序后的数组一样的结果。只需要遍历一次就可以的得到结果。
//注意:值得注意的是我们不仅需要比较相邻两个的时间,还有一个需要特殊处理的值就是数组中出现最早的时间和最晚的时间,可以把最早的时间当做第二天的时间,这时也可能出现最小的时间差随意在遍历的时候需要记录下来这样一个最大时间和最小时间用于判断这个特殊的值
public int findMinDifference(List<String> timePoints) {
//如果数组长度大于1440绝对存在两个相等的时间直接得到答案
if(timePoints.size() > 1440){
return 0;
}
//创建boolean数组,遍历timePoints将其转化为时间数组上的值
boolean[] time = new boolean[1440];
for(String point : timePoints){
//处理point的到“key”值
String[] points = point.split(":");
int key = Integer.valueOf(points[0]) * 60 + Integer.valueOf(points[1]);
//首先判断该时间是否已经存在,如果存在则代表数组中有两个相同的时间直接返回0
if(time[key]){
return 0;
}
//如果没有直接加入数组
time[key] = true;
}
//遍历time数组得到相邻两个值为true的差值,期间需要记录下来最大的一个值和最小的一个值用于判断特殊值
int pre = -1;
int first = 1439;
int last = -1;
int diff = 1439;
for(int i = 0; i < time.length;i++){
if(time[i]){
if(pre >= 0){
diff = Math.min(diff,i - pre);
}
pre = i;
last = Math.max(i,last);
first = Math.min(i, first);
}
}
//对比特殊结果返回最后的结果
return Math.min(diff,first + 1440 - last);
}
}
最小时间差java实现
最新推荐文章于 2023-01-26 10:19:56 发布