สมมติว่าเรามีช่วงเวลาว่างแสดงรายการ slot1 และ slots2 ของคนสองคนและระยะเวลาการประชุม d เราต้องหา time slot ที่เร็วที่สุดที่ใช้ได้สำหรับทั้งคู่และเป็นระยะเวลา d หากไม่มีช่วงเวลาทั่วไปที่ตรงตามข้อกำหนด ให้แสดงอาร์เรย์ว่าง ที่นี่ รูปแบบของช่วงเวลาคืออาร์เรย์ของสององค์ประกอบ [เริ่มต้น, สิ้นสุด] ซึ่งแสดงถึงช่วงเวลาที่รวมตั้งแต่ต้นจนจบ เราสามารถสรุปได้ว่าไม่มีช่องว่างสองช่องของบุคคลคนเดียวกันตัดกัน นั่นคือสำหรับช่วงเวลาสองช่วง [s1, e1] และ [s2, e2] ของบุคคลเดียวกัน ไม่ว่าจะเป็น s1> e2 หรือ s2> e ดังนั้นหากอินพุตเป็นเหมือน s1 =[[10,50], [60,120], [140,210]] และ s2 =[[0,15], [60,70]] และระยะเวลา =8 ผลลัพธ์จะเป็น [ 60,68].
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- i :=0 และ j :=0, สร้างหนึ่งอาร์เรย์ ans, เรียงลำดับ s1 และ s2
- ในขณะที่ฉัน <ขนาดของ s1 และ j <ขนาดของ s2
- end :=นาทีของ s1[i, 1] และ s2[j, 1]
- เริ่ม :=นาทีของ s1[i, 0] และ s2[j, 0]
- ถ้าสิ้นสุด – เริ่ม>=ระยะเวลา แล้ว
- แทรก start และ (start + Duration) ลงใน ans array แล้วคืนค่า ans
- มิฉะนั้น เมื่อ s1[i, 1]
- มิฉะนั้น ให้เพิ่ม j ขึ้น 1
- คืนสินค้า
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; void print_vector(vector<auto> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } using namespace std; bool cmp(vector <int> a, vector <int> b){ return a[0]<b[0]; } class Solution { public: vector<int> minAvailableDuration(vector<vector<int>>& slots1, vector<vector<int>>& slots2, int duration) { int i =0; int j = 0; vector <int> ans; sort(slots1.begin(),slots1.end(),cmp); sort(slots2.begin(),slots2.end(),cmp); while(i<slots1.size() && j<slots2.size()){ int end = min(slots1[i][1],slots2[j][1]); int start = max(slots1[i][0],slots2[j][0]); if(end-start>=duration){ ans.push_back(start); ans.push_back(start+duration); return ans; } else if(slots1[i][1]<slots2[j][1]) { i++; } else { j++;} } return ans; } }; main(){ vector<vector<int>> v = {{10,50},{60,120},{140,210}}; vector<vector<int>> v1 = {{0,15},{60,70}}; Solution ob; print_vector(ob.minAvailableDuration(v, v1, 8)); }
อินพุต
[[10,50],[60,120],[140,210]] [[0,15],[60,70]] 8
ผลลัพธ์
[60, 68, ]