Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ค้นหาจุดตัดของช่วงเวลาทั้งหมดใน C++


สมมุติว่าเรามีช่วง N ในรูปแบบ {L, R}, L คือเวลาเริ่มต้น และ R คือเวลาสิ้นสุด เราต้องหาจุดตัดของช่วงทั้งหมด ทางแยกคือช่วงที่อยู่ภายในช่วงที่กำหนดทั้งหมด หากไม่พบรายการดังกล่าว ให้คืนค่า -1 ตัวอย่างเช่น หากช่วงเวลาเช่น [{1, 6}, {2, 8}, {3, 10}, {5, 8}, ช่วงเอาต์พุตคือ {5, 6}

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • ถือว่าช่วงแรกเป็นช่วงสุดท้าย

  • เริ่มจากช่วงที่สอง ให้ลองค้นหาสี่แยก มีสองกรณี

    • ไม่มีจุดตัดระหว่าง [L1, R1] และ [L2, R2] ที่เป็นไปได้เฉพาะเมื่อ R1

    • ไม่มีทางแยกระหว่าง [L1, R1] และ [L2, R2] ดังนั้นทางแยกที่ต้องการจะเป็น {max(L1, L2), min(R1, R2)}

ตัวอย่าง

#include<iostream>
#include<algorithm>
using namespace std;
class interval{
   public:
      int left, right;
};
void findIntersection(interval intervals[], int N) {
   int l = intervals[0].left;
   int r = intervals[0].right;
   for (int i = 1; i < N; i++) {
      if (intervals[i].left > r || intervals[i].right < l) {
         cout << -1;
         return;
      } else {
         l = max(l, intervals[i].left);
         r = min(r, intervals[i].right);
      }
   }
   cout << "{" << l << ", " << r << "}";
}
int main() {
   interval intervals[] = {{ 1, 6 }, { 2, 8 }, { 3, 10 }, { 5, 8 } };
   int N = sizeof(intervals) / sizeof(intervals[0]);
   findIntersection(intervals, N);
}

ผลลัพธ์

{5, 6}