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