Leetcode 252. 会议室 253. 会议室II 贪心算法-扫描线技巧


labuladong讲解扫描线技巧

252. 会议室

题目:

给定一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervals[i] = [starti, endi] ,请你判断一个人是否能够参加这里面的全部会议。

示例 1:

输入:intervals = [[0,30],[5,10],[15,20]]
输出:false
示例 2:

输入:intervals = [[7,10],[2,4]]
输出:true

提示:

0 <= intervals.length <= 104
intervals[i].length == 2
0 <= starti < endi <= 106

思路:

求区间是否有重叠。可以将end按大小排序,然后比较后一个start是否大于前一个end

class Solution {
public:
    bool canAttendMeetings(vectorint>>& intervals) {
        sort(intervals.begin(),intervals.end(),[](vector<int>& a,vector<int>& b){
            return a[1]1];
        });
        int n=intervals.size();
        for(int i=1;ii){
            if(intervals[i][0]1][1])
                return false;
        }
        return true;
    }
};

253. 会议室 II

题目:

给你一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervals[i] = [starti, endi] ,返回 所需会议室的最小数量 。

输入:intervals = [[0,30],[5,10],[15,20]]

输出:2

思路:

实际上求最大重叠数。这里使用扫描线技巧。

把start和end分别排序。当遇到start时count++,当遇到end时count--。记录过程中count的最大值。就是最大重叠数。

class Solution {
public:
    int minMeetingRooms(vectorint>>& intervals) {
        int n=intervals.size();
        vector<int> start(n);
        vector<int> end(n);
        for(int i=0;ii){
            start[i]=intervals[i][0];
            end[i]=intervals[i][1];
        }
        sort(start.begin(),start.end());
        sort(end.begin(),end.end());
        int i=0,j=0;
        int count=0;
        int ret=0;
        while(in){
            if(start[i]<end[j]){
                count++;
                i++;
            }else{
                count--;
                j++;
            }
            ret=max(ret,count);
        }
        return ret;
    }
};