leetcode 最多可以参加的会议数目 中等
贪心: 对于开始时间相同的会议来说,肯定是先安排结束时间早的。
所以,可以枚举时间点,当某个会议在此时间点开始了,则将其结束时间加入优先队列。
对于优先队列来说,如果结束时间小于当前时间点,那么将其弹出。否则,取 top,安排会议,即 ++ ans;
// 由于需要从小到大排列结束时间,下列 push 结束时间的 相反数。(优先队列默认为大根堆.)
class Solution { public: int maxEvents(const vector<vector<int>>& events) { vector<int> begin[maxn]; // i 时间点开始的会议 for(int i = 0; i < events.size(); ++ i) { begin[events[i][0]].emplace_back(events[i][1]); } priority_queue<int> pque; // 当前待安排的会议终止时间 int nowTime = 1, ret = 0; while(nowTime < maxn) { for(auto &item : begin[nowTime]) pque.push(-item); while(!pque.empty()) { if(-pque.top() >= nowTime) break; pque.pop(); } if(!pque.empty()) { ++ ret; pque.pop(); } ++ nowTime; } return ret; } private: static const int maxn = 1e5 + 1; };