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

Meeting Rooms II ใน C++


สมมติว่ามีอาร์เรย์ของช่วงเวลาการประชุม มีเวลาเริ่มและสิ้นสุด [[s1,e1],[s2,e2],...] และแต่ละคู่สอดคล้องกับกฎ (si < ei) เราต้องหาจำนวนห้องประชุมขั้นต่ำที่จำเป็น

เช่น ถ้าอินพุทเป็น [[0, 30], [5, 10], [15, 20]] ผลลัพธ์จะเป็น 2

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

  • กำหนด priority queue pq

  • เรียงลำดับอาร์เรย์ intervals

  • ret := 0

  • ลูป i := 0 ถึงขนาดของ intervals-1 ทำ −

    • ลูป while (pq ไม่ว่าง และค่าบนสุดของ pq <= intervals[i][0]) ทำ −

      • ลบสมาชิกออกจาก pq

    • แทรก intervals[i] ลงใน pq

    • ret := สูงสุดของ ret และขนาดของ pq

  • คืนค่า ret

ตัวอย่าง

ลองดูการติดตั้งต่อไปนี้เพื่อให้เข้าใจได้ดีขึ้น −

#include <bits/stdc++.h> using namespace std; struct Comparator{    bool operator()(vector <int>& a, vector <int>& b){       return !(a[1] < b[1]);    } }; class Solution { public:    static bool cmp(vector <int> a, vector <int> b){       return (a[1] < b[1]);    }    int minMeetingRooms(vector<vector<int>>& intervals) {       priority_queue<vector<int>, vector<vector<int> >, Comparator> pq;       sort(intervals.begin(), intervals.end());       int ret = 0;       for (int i = 0; i < intervals.size(); i++) {          while (!pq.empty() && pq.top()[1] <= intervals[i][0])          pq.pop();          pq.push(intervals[i]);          ret = max(ret, (int)pq.size());       }       return ret;    } }; main(){    vector<vector<int>> v = {{0, 30}, {5, 10}, {15, 20}};    Solution ob;    cout << (ob.minMeetingRooms(v)); }

อินพุท

{{0, 30}, {5, 10}, {15, 20}}

เอาต์พุท

2