Giả sử chúng ta có một danh sách các mốc thời gian 24 giờ trên đồng hồ ở định dạng "Giờ:Phút", chúng ta phải tìm chênh lệch số phút tối thiểu giữa hai mốc thời gian bất kỳ trong danh sách. Vì vậy, nếu đầu vào giống như [“12:30”, ”15:17”], thì điều này sẽ trả về 167.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- Xác định một mảng được gọi là ok có kích thước 24 * 60 + 1 và ban đầu tất cả đều sai.
- n:=kích thước của tp
- cho tôi trong phạm vi từ 0 đến n - 1
- hr:=phần giờ của thời gian
- min:=phần phút của chuỗi
- thời gian:=giờ * 60 + phút
- nếu ok [time] là true thì trả về 0, nếu không thì đặt ok [time] là true.
- cuối cùng:=0, đầu tiên:=inf, ret:=inf, trước:=-inf
- cho tôi trong phạm vi từ 0 đến 24 * 60
- nếu ok [i] là true, thì
- cuối cùng:=tối đa của tôi, cuối cùng
- first:=phút của tôi và lần đầu tiên
- nếu trước đó không phải là –inf, thì ret:=tối thiểu trong tổng số lần truy cập và cuối cùng - trước đó
- trước:=i
- nếu ok [i] là true, thì
- trả về tối thiểu ret và 24 * 60 + first-last.
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn &mnus;
Ví dụ
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int findMinDifference(vector<string>& tp) {
vector <bool> ok(24 * 60 + 1, false);
int n = tp.size();
for(int i = 0; i < n; i++){
int hr = stoi(tp[i].substr(0, 2));
int min = stoi(tp[i].substr(3, 2));
int time = hr * 60 + min;
if(ok[time]) return 0;
ok[time] = true;
}
int last = 0;
int first = INT_MAX;
int ret = INT_MAX;
int prev = INT_MIN;
for(int i = 0; i <= 24 * 60; i++){
if(ok[i]){
last = max(i, last);
first = min(i, first);
if(prev != INT_MIN) ret = min(ret, last - prev);
prev = i;
}
}
return min(ret, 24 * 60 + first - last);
}
};
main(){
vector<string> v = {"12:30","15:17"};
Solution ob;
cout << (ob.findMinDifference(v));
} Đầu vào
["12:30","15:17"]
Đầu ra
167