Cho danh sách thời gian định dạng "HH:MM" (24h), tìm khoảng cách phút nhỏ nhất giữa hai thời gian bất kỳ.
Ví dụ: ["12:30","15:17"] → 167 phút.
Thuật toán (Mảng đánh dấu + Duyệt tuyến tính)
- Mảng
ok[1441]đánh dấu phút đã xuất hiện. - Chuyển mỗi thời gian thành phút
hh*60+mm. Nếu trùng → trả về 0. - Duyệt qua 1440 phút, tính khoảng cách giữa các thời gian liên tiếp, và khoảng cách vòng tròn (cuối - đầu + 1440).
Mã nguồn C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int findMinDifference(vector<string>& tp) {
vector<bool> ok(24*60+1, false);
for (string& t : tp) {
int hr = stoi(t.substr(0,2));
int mn = stoi(t.substr(3,2));
int time = hr*60 + mn;
if (ok[time]) return 0;
ok[time] = true;
}
int first = INT_MAX, last = 0, prev = INT_MIN, ret = INT_MAX;
for (int i = 0; i <= 24*60; i++) {
if (ok[i]) {
first = min(first, i);
last = max(last, i);
if (prev != INT_MIN) ret = min(ret, i - prev);
prev = i;
}
}
return min(ret, 24*60 + first - last);
}
};
int main() {
vector<string> v = {"12:30","15:17"};
Solution ob;
cout << ob.findMinDifference(v);
return 0;
}
Đầu vào / Đầu ra
Input: ["12:30","15:17"]
Output: 167