尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

【贪心-2】253.会议室 II

【贪心-2】253.会议室 II 题目描述给定一个会议时间安排的数组intervals每个会议时间包括开始和结束的时间[start, end]计算至少需要多少间会议室才能满足所有会议安排。示例输入: [[0, 30], [5, 10], [15, 20]] 输出: 2 输入: [[7, 10], [2, 4]] 输出: 1解题思路方法一排序 小根堆推荐核心思路按开始时间排序所有会议用小根堆维护当前正在使用的会议室的结束时间遍历每个会议如果堆顶最早结束的会议≤ 当前会议的开始时间说明有会议室空闲弹出堆顶把当前会议的结束时间压入堆堆的大小就是所需的最少会议室数量具体过程示例intervals [[0, 30], [5, 10], [15, 20]]排序后[[0, 30], [5, 10], [15, 20]]会议堆操作堆内容说明[0, 30]push(30)[30]第一间会议室[5, 10]堆顶30 5push(10)[10, 30]需要第二间[15, 20]堆顶10 ≤ 15poppush(20)[20, 30]复用第一间堆大小 2 ✅代码实现class Solution { public: int minMeetingRooms(vectorvectorint intervals) { if (intervals.empty()) return 0; // 按开始时间排序 sort(intervals.begin(), intervals.end()); // 小根堆存储结束时间 priority_queueint, vectorint, greaterint pq; for (auto interval : intervals) { // 如果有会议室空闲弹出最早结束的 if (!pq.empty() pq.top() interval[0]) { pq.pop(); } pq.push(interval[1]); } return pq.size(); } };复杂度分析维度复杂度说明时间复杂度O(n log n)排序 每个会议一次堆操作空间复杂度O(n)堆最多存储 n 个结束时间方法二扫描线思路把每个会议拆成两个事件开始1需要一间会议室结束-1释放一间会议室按时间排序所有事件累加计数最大值就是所需会议室数。关键同一时间有开始和结束结束优先处理先释放再占用。具体过程示例intervals [[0, 30], [5, 10], [15, 20]]事件(0,1), (5,1), (10,-1), (15,1), (20,-1), (30,-1)时间事件计数最大值0111512210-1121512220-11230-102结果2✅代码实现class Solution { public: int minMeetingRooms(vectorvectorint intervals) { vectorpairint, int events; for (auto interval : intervals) { events.push_back({interval[0], 1}); // 开始 events.push_back({interval[1], -1}); // 结束 } // 按时间排序同一时间结束优先-1 在前 sort(events.begin(), events.end(), [](const pairint,int a, const pairint,int b) { if (a.first b.first) return a.second b.second; return a.first b.first; }); int count 0, maxRooms 0; for (auto [time, delta] : events) { count delta; maxRooms max(maxRooms, count); } return maxRooms; } };复杂度分析维度复杂度说明时间复杂度O(n log n)排序事件空间复杂度O(n)事件数组方法三双指针思路把开始时间和结束时间分别排序用两个指针比较如果start[s] end[e]新会议开始需要新会议室counts否则有会议结束释放会议室count--e代码实现class Solution { public: int minMeetingRooms(vectorvectorint intervals) { int n intervals.size(); vectorint starts(n), ends(n); for (int i 0; i n; i) { starts[i] intervals[i][0]; ends[i] intervals[i][1]; } sort(starts.begin(), starts.end()); sort(ends.begin(), ends.end()); int s 0, e 0, count 0, maxRooms 0; while (s n) { if (starts[s] ends[e]) { count; s; } else { count--; e; } maxRooms max(maxRooms, count); } return maxRooms; } };复杂度分析维度复杂度说明时间复杂度O(n log n)排序两个数组空间复杂度O(n)两个辅助数组三种方法对比方法时间复杂度空间复杂度代码复杂度推荐度排序 小根堆O(n log n)O(n)中等⭐⭐⭐⭐⭐扫描线O(n log n)O(n)中等⭐⭐⭐⭐双指针O(n log n)O(n)简单⭐⭐⭐⭐总结要点说明核心思想求重叠会议的最大数量最优解法排序 小根堆维护结束时间关键操作堆顶 ≤ 当前开始时间 → 复用会议室时间复杂度O(n log n)空间复杂度O(n)
返回列表