สมมติว่าเรามีรายการจุดเวลานาฬิกาแบบ 24 ชั่วโมงในรูปแบบ "ชั่วโมง:นาที" เราต้องหาความแตกต่างของนาทีขั้นต่ำระหว่างจุดเวลาสองจุดใดๆ ในรายการ ดังนั้นหากอินพุตเป็น [“12:30”,”15:17”] ก็จะคืนค่า 167
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- กำหนดอาร์เรย์ที่เรียกว่า ok ขนาด 24*60 + 1 และเริ่มต้นทั้งหมดเป็นเท็จ
- n :=ขนาดของ tp
- สำหรับ i ในช่วง 0 ถึง n – 1
- hr :=ส่วนชั่วโมงนับจากเวลา
- นาที :=ส่วนนาทีของสตริง
- เวลา :=ชม. * 60 + นาที
- ถ้า ok[time] เป็นจริง ให้คืนค่า 0 มิฉะนั้น ให้ตั้งค่า ok[time] เป็นจริง
- สุดท้าย :=0, แรก :=inf, ret :=inf, ก่อนหน้า :=-inf
- สำหรับ i ในช่วง 0 ถึง 24*60
- ถ้า ok[i] เป็นจริง แล้ว
- สุดท้าย :=สูงสุดของ i สุดท้าย
- first :=min ของ i และ first
- ถ้า prev ไม่ใช่ –inf ให้ ret :=min ของ ret และ last – prev
- ก่อนหน้า :=ผม
- ถ้า ok[i] เป็นจริง แล้ว
- ผลตอบแทนขั้นต่ำของ ret และ 24*60+ก่อน-สุดท้าย
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น &mnus;
ตัวอย่าง
#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));
} อินพุต
["12:30","15:17"]
ผลลัพธ์
167