539. Minimum Time Difference**
https://leetcode.com/problems/minimum-time-difference/
题目描述
Given a list of 24-hour clock time points in "Hour:Minutes"
format, find the minimum minutes difference between any two time points in the list.
Example 1:
Input: ["23:59","00:00"]
Output: 1
Note:
- The number of time points in the given list is at least 2 and won’t exceed 20000.
- The input time is legal and ranges from
00:00
to23:59
.
C++ 实现 1
先给出看起来代码较繁琐的解法, 再给出更为简洁的代码.
思路是对时间进行从小到大排序, 求前后两个时间的差值, 注意对于最后一个时间 time[n - 1]
, 它还要和 time[0]
进行比较.
下面代码中,
- 使用
Comp()
对时间进行排序 (实际上可以不需要写的像我这样繁琐, 直接对时间排序即可, 具体见C++ 实现 2
). - 使用
difference
求前后两个时间的差值, 应该比较比较:std::abs(hour1 * 60 + min1 - (hour2 * 60 + min2))
- 另外的
std::min(std::abs(24 * 60 - hour1 * 60 - min1) + hour2 * 60 + min2
以及std::abs(24 * 60 - hour2 * 60 - min2) + hour1 * 60 + min1)
![](https://i-blog.csdnimg.cn/blog_migrate/f024bcf37ff973df70042c5a95094578.jpeg)
时间差距可以分为两个部分, d1
和 d2
, 取其中最小的. 这部分的代码也写复杂了, 其实可以更为简洁的.
class Solution {
private:
struct Comp {
bool operator()(const string &p, const string &q) {
auto hour1 = p.substr(0, 2), hour2 = q.substr(0, 2);
auto min1 = p.substr(3, 2), min2 = q.substr(3, 2);
return hour1 == hour2 ? min1 < min2 : hour1 < hour2;
}
};
int difference(const string &p, const string &q) {
auto hour1 = std::stoi(p.substr(0, 2)), hour2 = std::stoi(q.substr(0, 2));
auto min1 = std::stoi(p.substr(3, 2)), min2 = std::stoi(q.substr(3, 2));
return std::min(std::abs(hour1 * 60 + min1 - (hour2 * 60 + min2)),
std::min(std::abs(24 * 60 - hour1 * 60 - min1) + hour2 * 60 + min2,
std::abs(24 * 60 - hour2 * 60 - min2) + hour1 * 60 + min1));
}
public:
int findMinDifference(vector<string>& timePoints) {
std::sort(timePoints.begin(), timePoints.end(), Comp());
int res = INT32_MAX;
for (int i = 1; i < timePoints.size(); ++ i) {
res = std::min(res, difference(timePoints[i - 1], timePoints[i]));
}
res = std::min(res, difference(timePoints.front(), timePoints.back()));
return res;
}
};
C++ 实现 2
代码来自: [C++] Clean Code
时间差距直接用 24 * 60 - diff
即可求得, 不必像我在 C++ 实现 1
中写的那么复杂.
class Solution {
public:
int findMinDifference(vector<string>& times) {
int n = times.size();
sort(times.begin(), times.end());
int mindiff = INT_MAX;
for (int i = 0; i < times.size(); i++) {
int diff = abs(timeDiff(times[(i - 1 + n) % n], times[i]));
diff = min(diff, 1440 - diff);
mindiff = min(mindiff, diff);
}
return mindiff;
}
private:
int timeDiff(string t1, string t2) {
int h1 = stoi(t1.substr(0, 2));
int m1 = stoi(t1.substr(3, 2));
int h2 = stoi(t2.substr(0, 2));
int m2 = stoi(t2.substr(3, 2));
return (h2 - h1) * 60 + (m2 - m1);
}
};