题目
给定一个 24 小时制(小时:分钟 "HH:MM")的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
示例 1:
输入:timePoints = ["23:59","00:00"] 输出:1
示例 2:
输入:timePoints = ["00:00","23:59","00:00"] 输出:0
提示:
2 <= timePoints <= 2 * 104
timePoints[i]
格式为 "HH:MM"
注意:本题与主站 539 题相同: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
题解
思路一:排序后,在两两相邻间寻找最小。可以用数组diff[]记录,也可以用int ans记录,在过程中无需存储其他值。
class Solution {
public int findMinDifference(List<String> timePoints) {
Collections.sort(timePoints, (o1,o2)->o1.compareTo(o2));
int[] diff=new int[timePoints.size()];
int min=25*60;
for(int i=0;i<diff.length-1;i++) {
diff[i]=minus(timePoints.get(i),timePoints.get(i+1));
if(diff[i]<min) min=diff[i];
}
diff[diff.length-1]=minus(timePoints.get(timePoints.size()-1),timePoints.get(0))+24*60;
if(diff[diff.length-1]<min) min=diff[diff.length-1];
return min;
}
public int minus(String s1,String s2) {
int s1h=Integer.parseInt(s1.substring(0,2));
int s1m=Integer.parseInt(s1.substring(3,5));
int s2h=Integer.parseInt(s2.substring(0,2));
int s2m=Integer.parseInt(s2.substring(3,5));
return (s2h-s1h)*60+(s2m-s1m);
}
}
tips:java的集合排序,Collections.sort(),两个时间的大小对比,可以使用H差*60+M差,也可以将时间转化为相较于00:00的分钟,然后相减。写一个getMinutes(String time)
思路二:根据鸽巢原理(如果有n+1个鸽子飞进了n个鸽巢中,那么必定有鸽巢中至少飞进了2只鸽子),一共有 24×60=144024 \times 60=144024×60=1440 种不同的时间,若LIst长度大于1440,则直接返回0