2026/4/16 8:48:55
网站建设
项目流程
网站优秀网站地址,代理商门户网站开发,徐州企业建站系统,什么免费网站可以链接域名【LetMeFly】2402.会议室 III#xff1a;优先队列大模拟
力扣题目链接#xff1a;https://leetcode.cn/problems/meeting-rooms-iii/
给你一个整数 n #xff0c;共有编号从 0 到 n - 1 的 n 个会议室。
给你一个二维整数数组 meetings #xff0c;其中 meetings[i] [s…【LetMeFly】2402.会议室 III优先队列大模拟力扣题目链接https://leetcode.cn/problems/meeting-rooms-iii/给你一个整数n共有编号从0到n - 1的n个会议室。给你一个二维整数数组meetings其中meetings[i] [starti, endi]表示一场会议将会在半闭时间区间[starti, endi)举办。所有starti的值互不相同。会议将会按以下方式分配给会议室每场会议都会在未占用且编号最小的会议室举办。如果没有可用的会议室会议将会延期直到存在空闲的会议室。延期会议的持续时间和原会议持续时间相同。当会议室处于未占用状态时将会优先提供给原开始时间更早的会议。返回举办最多次会议的房间编号。如果存在多个房间满足此条件则返回编号最小的房间。半闭区间[a, b)是a和b之间的区间包括a但不包括b。示例 1输入n 2, meetings [[0,10],[1,5],[2,7],[3,4]]输出0解释- 在时间 0 两个会议室都未占用第一场会议在会议室 0 举办。 - 在时间 1 只有会议室 1 未占用第二场会议在会议室 1 举办。 - 在时间 2 两个会议室都被占用第三场会议延期举办。 - 在时间 3 两个会议室都被占用第四场会议延期举办。 - 在时间 5 会议室 1 的会议结束。第三场会议在会议室 1 举办时间周期为 [5,10) 。 - 在时间 10 两个会议室的会议都结束。第四场会议在会议室 0 举办时间周期为 [10,11) 。 会议室 0 和会议室 1 都举办了 2 场会议所以返回 0 。示例 2输入n 3, meetings [[1,20],[2,10],[3,5],[4,9],[6,8]]输出1解释- 在时间 1 所有三个会议室都未占用第一场会议在会议室 0 举办。 - 在时间 2 会议室 1 和 2 未占用第二场会议在会议室 1 举办。 - 在时间 3 只有会议室 2 未占用第三场会议在会议室 2 举办。 - 在时间 4 所有三个会议室都被占用第四场会议延期举办。 - 在时间 5 会议室 2 的会议结束。第四场会议在会议室 2 举办时间周期为 [5,10) 。 - 在时间 6 所有三个会议室都被占用第五场会议延期举办。 - 在时间 10 会议室 1 和 2 的会议结束。第五场会议在会议室 1 举办时间周期为 [10,12) 。 会议室 1 和会议室 2 都举办了 2 场会议所以返回 1 。提示1 n 1001 meetings.length 105meetings[i].length 20 starti endi 5 * 105starti的所有值互不相同解题方法大模拟——两个优先队列有没有发现这道题有严格的顺序优先级使用优先队列再合适不过了。先想想我们的策略再思考具体怎么模拟遍历按开始时间递增的会议因为开始时间早是安排会议的优先级依据对于某个待安排的会议查看到会议开始时间为止有没有新释放的会议室查看此刻有没有空的会议室如果有则使用编号最小的那个会议室否则等待到一个会议室释放为止并使用之同一时间多会议室到期则优先释放编号较小的那个多清晰的流水线啊只需要用代码将其表现出来就好了。对于会议只需要按照开始时间从小到大排个序因为会议的安排顺序是严格按照开始时间安排的且开始时间互不相同。对于会议室的使用空闲会议室优先使用编号最小的所以可以使用一个优先队列来存放空闲会议室。对于在使用的会议室优先释放结束时间最早的那个有释放时间相同则优先释放编号较小的那个所以也可以使用一个优先队列来维护。注意10 5 10^5105个5 × 10 5 5\times10^55×105可能会超过int32。时间复杂度O ( m log m n log n m log n ) O(m\log m n\log n m\log n)O(mlogmnlognmlogn)其中m l e n ( m e e t i n g s ) mlen(meetings)mlen(meetings)。m log m m\log mmlogm来自会议的排序n log n n\log nnlogn来自n nn个会议室初始状态的入队m log n m\log nmlogn来自每个会议的会议室分配空间复杂度O ( n ) O(n)O(n)。AC代码C/* * LastEditTime: 2025-12-27 23:36:34 */typedeflonglongll;// 10^5个5*10^5可能会超int32!classSolution{public:intmostBooked(intn,vectorvectorintmeetings){sort(meetings.begin(),meetings.end());priority_queueint,vectorint,greatercanuse;for(inti0;in;i){canuse.push(i);}priority_queuepairll,int,vectorpairll,int,greaterinuse;vectorinttimes(n);for(vectorintmeeting:meetings){// 先看有没有新释放的while(!inuse.empty()inuse.top().firstmeeting[0]){auto[_,thisRoom]inuse.top();canuse.push(thisRoom);inuse.pop();}intthisRoom;ll endTime;// 看看有没有空的if(!canuse.empty()){thisRoomcanuse.top();endTimemeeting[1];canuse.pop();}else{// 等到第一个释放auto[freeTime,room]inuse.top();thisRoomroom;endTimefreeTimemeeting[1]-meeting[0];inuse.pop();}times[thisRoom];inuse.push({endTime,thisRoom});}returnmax_element(times.begin(),times.end())-times.begin();}};#ifdefined(_WIN32)||defined(__APPLE__)/* 2 [[0,10],[1,5],[2,7],[3,4]] 0 */intmain(){intn;string s;while(cinns){Solution sol;vectorvectorintvstringToVectorVector(s);coutsol.mostBooked(n,v)endl;}return0;}#endif同步发文于CSDN和我的个人博客原创不易转载经作者同意后请附上原文链接哦~千篇源码题解已开源