题目
给定一个 24 小时制(小时:分钟 "HH:MM")的时间列表,找出列表中任意两个时间的最小时间差并以分钟数表示。
示例:
输入:timePoints = ["23:59","00:00"]
输出:1
解答
通过字符串排序,将时间进行从小到大的排序;
然后依次求相邻时间的差值即可。
此外需要注意加上第一个和最后一个时间的差,同时,也可以依据 “一天24小时最多有24 * 60 = 1440个分钟时刻” 进行剪枝。
代码如下:
class Solution {
public:
int getDiff(string &a, string &b) {
int hourA = (a[0] - '0') * 10 + (a[1] - '0');
int hourB = (b[0] - '0') * 10 + (b[1] - '0');
int minA = (a[3] - '0') * 10 + (a[4] - '0');
int minB = (b[3] - '0') * 10 + (b[4] - '0');
int l = abs((hourA - hourB) * 60 + minA - minB);
return min(l, 1440 - l);
}
int findMinDifference(vector<string> &timePoints) {
int n = timePoints.size();
// n > 1440 进行剪枝,因为最多只能有1440个分钟时刻
if (n > 1440) {
return 0;
}
// 将时间序列进行排序
sort(timePoints.begin(), timePoints.end());
int ret = getDiff(timePoints[0], timePoints[n - 1]);
string before = timePoints[0];
// 依次比较即可
for (int i = 1; i < n; ++i) {
int tmp = getDiff(before, timePoints[i]);
if (tmp < ret) {
ret = tmp;
}
before = timePoints[i];
}
return ret;
}
};