0
点赞
收藏
分享

微信扫一扫

539. Minimum Time Difference**

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​​​ to​​23: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)​

539. Minimum Time Difference**_leetcode

时间差距可以分为两个部分, ​​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);
}
};

举报

相关推荐

0 条评论