难度:medium
思路:先进行升序排序,然后最小时间差一定存在在两个相邻的时间差里面,可以通过鸽巢原理进行剪枝:如果timesPoints列表的时间数大于24*60个,那么就一定有两个相同的时间在列表里面,此时最小时间差为0;
Java:
class Solution {
public int findMinDifference(List<String> timePoints) {
//鸽巢原理+排序
int length = timePoints.size();
if(length > 24 * 60) {
return 0;
}
Collections.sort(timePoints);
// int time = getMinutesget(0);
int ans = Integer.MAX_VALUE;
for (int i = 1; i < timePoints.size(); i++) {
ans = Math.min(ans, getMinutes(timePoints.get(i)) - getMinutes(timePoints.get(i - 1)));
}
ans = Math.min(ans, getMinutes(timePoints.get(0)) + 24 * 60 - getMinutes(timePoints.get(length - 1)));
return ans;
}
public int getMinutes(String t) {
int time = (t.charAt(3) - '0') * 10 + (t.charAt(4) - '0') + ((t.charAt(0) - '0') * 10 + (t.charAt(1) - '0')) * 60;
return time;
}
}
复杂度分析:
- 时间复杂度:O(nlogn),排序
- 空间复杂度:O(logn),排序所需栈空间
还可以使用桶排序的方法。使复杂度变为O(C);