GitOps安全:保护GitOps工作流的安全
2026/5/15 0:25:28
力扣题目链接: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。
/* * @LastEditTime: 2025-12-27 23:36:34 */typedeflonglongll;// 10^5个5*10^5可能会超int32!classSolution{public:intmostBooked(intn,vector<vector<int>>&meetings){sort(meetings.begin(),meetings.end());priority_queue<int,vector<int>,greater<>>canuse;for(inti=0;i<n;i++){canuse.push(i);}priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<>>inuse;vector<int>times(n);for(vector<int>&meeting:meetings){// 先看有没有新释放的while(!inuse.empty()&&inuse.top().first<=meeting[0]){auto[_,thisRoom]=inuse.top();canuse.push(thisRoom);inuse.pop();}intthisRoom;ll endTime;// 看看有没有空的if(!canuse.empty()){thisRoom=canuse.top();endTime=meeting[1];canuse.pop();}else{// 等到第一个释放auto[freeTime,room]=inuse.top();thisRoom=room;endTime=freeTime+meeting[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(cin>>n>>s){Solution sol;vector<vector<int>>v=stringToVectorVector(s);cout<<sol.mostBooked(n,v)<<endl;}return0;}#endif同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
千篇源码题解已开源