สมมติว่าเรามีรายการจุดเวลานาฬิกาแบบ 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