LeetCode—253.会议室 II(Meeting Rooms II)——分析及代码(C++)

LeetCode—253.会议室 II[Meeting Rooms II]——分析及代码[C++]

  • 一、题目
  • 二、分析及代码
    • 1. 起止时间分别排序
      • (1)思路
      • (2)代码
      • (3)结果
  • 三、其他

一、题目

给定一个会议时间安排的数组,每个会议时间都会包括开始和结束的时间 [[s1,e1],[s2,e2],…] (si < ei),为避免会议冲突,同时要考虑充分利用会议室资源,请你计算至少需要多少间会议室,才能满足这些会议安排。

示例 1:

输入: [[0, 30],[5, 10],[15, 20]]
输出: 2

示例 2:

输入: [[7,10],[2,4]]
输出: 1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/meeting-rooms-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、分析及代码

1. 起止时间分别排序

(1)思路

设计两个向量,分别记录所有会议的 开始时间 和 结束时间 并排序,用两个整数分别记录当前的 会议室数量 及 空余会议室数量。
遍历 开始时间,依次处理:
1)有 结束时间 < 当前开始时间,空余会议室数量++,指针指向下一 结束时间;
2)若 空余会议室数量 = 0,会议室数量++;
3)若 空余会议室数量 != 0,空余会议室数量–;
因为排序后数组一定满足 第 i 个开始时间 < 第 i 个结束时间,过程不会出错。

(2)代码

class Solution {
public:
    int minMeetingRooms(vector<vector<int>>& intervals) {
        if (intervals.empty())
            return 0;
        vector<int> begin_time(intervals.size());//所有会议的开始时间 
        vector<int> end_time(intervals.size());//所有会议的结束时间
        for (int i = 0; i < intervals.size(); i++) {
            begin_time[i] = intervals[i][0];
            end_time[i] = intervals[i][1];
        }
        sort(begin_time.begin(), begin_time.end());
        sort(end_time.begin(), end_time.end());
        int room = 0, free_room = 0, endnum = 0;//会议室数量,空余会议室数量,已结束的会议个数
        for (int i = 0; i < intervals.size(); i++) {
            int time = begin_time[i];
            while (endnum < intervals.size() && end_time[endnum] < time + 1) {//处理当前时间前已结束的会议
                endnum++;
                free_room++;
            }
            if (free_room > 0)//有空余会议室,借下1个空余会议室
                free_room--;
            else//无空余会议室,需新会议室
                room++;
        }
        return room;
    }
};

(3)结果

执行用时 :20 ms, 在所有 C++ 提交中击败了 91.94% 的用户;
内存消耗 :12 MB, 在所有 C++ 提交中击败了 100.00% 的用户。

三、其他

暂无。

你可能感兴趣的:(数据结构与算法,LeetCode,C++,题解)