题目链接
题目描述
给你一个会议时间安排的数组intervals,每个会议时间都会包括开始和结束的时间intervals[i]=[starti,endi],返回所需会议室的最小数量。


思路
- 首先将会议按照会议开始时间排序;
- 定义一个优先队列,存放会议结束时间,顶部是目前最快的结束时间;
- 每次判断新的会议安排的开始时间是否不早于目前最快结束的会议时间,如果不早于就可以直接用已经结束会议的会议室,而不需要新的会议室;否则,需要新的会议室。
代码实现
#include <bits/stdc++.h>
using namespace std;
int minMeetingRooms(vector<vector<int>>& intervals) {
// 按照会议开始时间排序
sort(intervals.begin(), intervals.end());
priority_queue<int, vector<int>, greater<>> pq; // 存会议结束时间,顶部是最小元素
pq.push(intervals[0][1]);
for (int i = 1; i < intervals.size(); i++) {
if (pq.top() <= intervals[i][0]) {
pq.pop();
}
pq.push(intervals[i][1]);
}
return pq.size();
}
int main() {
vector<vector<int>> intervals = {{0,30},{5,10},{15,20}};
// vector<vector<int>> intervals = {{7,10},{2,4}};
cout << minMeetingRooms(intervals) << endl;
return 0;
}
其他
也可以每次都把已经结束的会议删除,最后的结果是每次队列大小的最大值。
#include <bits/stdc++.h>
using namespace std;
int minMeetingRooms(vector<vector<int>>& intervals) {
// 按照会议开始时间排序
sort(intervals.begin(), intervals.end());
priority_queue<int, vector<int>, greater<>> pq; // 存会议结束时间,顶部是最小元素
pq.push(intervals[0][1]);
int ans = 1;
for (int i = 1; i < intervals.size(); i++) {
while (pq.size() > 0 && pq.top() <= intervals[i][0]) {
pq.pop();
}
pq.push(intervals[i][1]);
ans = max(ans, (int)pq.size());
}
return ans;
}
int main() {
// vector<vector<int>> intervals = {{0,30},{5,10},{15,20}};
vector<vector<int>> intervals = {7,10},{2,4}};
cout << minMeetingRooms(intervals) << endl;
return 0;
}

3278

被折叠的 条评论
为什么被折叠?



