Description
给你一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervals[i] = [starti, endi] ,返回 所需会议室的最小数量 。
Example
输入:intervals = [[0,30],[5,10],[15,20]]
输出:2
Analysis
1、模拟
用优先队列维护每个会议室的结束时间,每次与最小的结束时间进行比较,更新最小结束时间或创建新的会议室
2、上下车
类似于公交车上下车,开始时间+1,结束时间-1,记录中间过程最大的值
Code
优先队列
static bool cmp(const vector<int> &a, const vector<int> &b) {
if(a[0] == b[0]) return a[1] < b[1];
return a[0] < b[0];
}
int minMeetingRooms(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end(), cmp);
priority_queue<int, vector<int>, greater<int>> q;
int ans = 1;
q.push(intervals[0][1]);
for(int i = 1;i < intervals.size();i++) {
if(intervals[i][0] >= q.top()) {
q.pop();q.push(intervals[i][1]);
} else {
q.push(intervals[i][1]);
}
}
return q.size();
}
上下车
int minMeetingRooms(vector<vector<int>>& intervals) {
vector<pair<int,int>> v;
for(auto i : intervals) {
v.push_back(make_pair(i[0], 1));
v.push_back(make_pair(i[1], -1));
}
sort(v.begin(), v.end());
int ans = 0, c = 0;
for(auto i : v) {
c += i.second;
ans = max(ans, c);
}
return ans;
}