Giả sử có một mảng các khoảng thời gian họp. Có hai thời điểm bắt đầu và thời gian kết thúc [[s1, e1], [s2, e2], ...] và mỗi cặp thỏa mãn quy tắc (si
Vì vậy, nếu đầu vào là [[0, 30], [5, 10], [15, 20]], thì đầu ra sẽ là 2.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
-
xác định một hàng đợi ưu tiên pq
-
sắp xếp mảng khoảng thời gian
-
ret:=0
-
để khởi tạo i:=0, khi i
-
while (không phải pq trống và phần tử trên cùng của pq <=khoảng [i, 0]), do -
-
xóa phần tử khỏi pq
-
-
chèn khoảng [i] vào pq
-
ret:=tối đa của ret và kích thước của pq
-
-
trả lại ret
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
#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)); }
Đầu vào
{{0, 30}, {5, 10}, {15, 20}}
Đầu ra
2