题目:
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.
思路:
最直观的思路就是排序了,然后依次检查相邻的两个时间结点的分钟差,当然最后不要忘了第一个时间结点和最后一个时间结点之间的分钟差。算法的时间复杂度是O(nlogn)。还有一种思路就是利用堆,每次取出时间结点最大的一个,然后和当前结点比较。从理论上讲,这种堆的解法的时间复杂度仍然是O(nlogn),但是测试中发现堆版本的时间要少于排序版本。
代码:
1、排序:
class Solution {
public:
int findMinDifference(vector<string>& timePoints) {
vector<int> times;
for (auto t : timePoints) {
int value = 60 * stoi(t.substr(0, 2)) + stoi(t.substr(3, 2));
times.push_back(value);
}
sort(times.begin(), times.end());
int ret = times[0] + 24 * 60 - times.back();
for (int i = 1; i < times.size(); ++i) {
ret = min(ret, times[i] - times[i - 1]);
}
return ret;
}
};
2、堆:
class Solution {
public:
int findMinDifference(vector<string>& timePoints) {
vector<int> times;
for (auto t : timePoints) {
int value = 60 * stoi(t.substr(0, 2)) + stoi(t.substr(3, 2));
times.push_back(value);
}
make_heap(times.begin(), times.end());
int first = times[0], current = times[0];
int ret = INT_MAX;
pop_heap(times.begin(), times.end());
times.pop_back();
while (!times.empty()) {
int next = times[0];
pop_heap(times.begin(), times.end());
times.pop_back();
ret = min(ret, current - next);
current = next;
}
current += 24 * 60;
ret = min(ret, current - first);
return ret;
}
};