Leetcode:252. 会议室

题目来源

题目描述

在这里插入图片描述

class Interval {
public:
    int start, end;
    Interval(int start, int end) {
        this->start = start;
        this->end = end;
    }
};

class Solution {
public:
    bool canAttendMeetings(vector<Interval> &intervals) {
       
    }
};

题目解析

因为一个人在同一时刻只能参加一个会议,因此题目实质是判断是否存在重叠区间

思路

  • 最简单的方法是将数组中的会议全部两两比较,判断它们是否有冲突(即它们的时间是否有重叠)。如果一个会议开始时另一个会议依然没有结束,则它们存在冲突
class Solution {
    // (5, 8) (6, 8)
    bool ok(Interval i1, Interval i2){
        // 因为不清楚到达是哪一个先开始的(会议开始的时候,另一个会议已经结束了,那么就是ok的)
        return i2.start >= i1.end || i1.start >= i2.end;
    }
public:
    bool canAttendMeetings(vector<Interval > &intervals) {
        for (int i = 0; i < intervals.size(); ++i) {
            for (int j = i + 1; j < intervals.size(); ++j) {
                if(!ok(intervals[i], intervals[j])){
                    return false;
                }
            }
        }
        return true;
    }
};

怎么优化呢?

class Solution {
public:
    bool canAttendMeetings(vector<Interval > &intervals) {
        if(intervals.size() <= 1){
            return true;
        }

		 // 将区间按照会议开始时间升序排序
        std::sort(intervals.begin(), intervals.end(), [](Interval &a, Interval &b){
            return a.start < b.start;
        });

 		// 遍历会议,如果下一个会议在前一个会议结束之前就开始了,返回 false。
        for (int i = 1; i < intervals.size(); ++i) {
            if(intervals[i - 1].end > intervals[i].start){
                return false;
            }
        }
        return true;
    }
};

类似题目

题目思路
leetcode:56. 将所有重叠的区间合并到一个区间里面 Merge Intervals先按照起始位置排序,然后判断区间是否重叠(start[i] < end) ,如果不重叠,那么压入一个新的区间,否则更新右边界
Leetcode:252. 会议室 Meeting Rooms 本身是判断是否存在重叠区间。将区间按照会议开始时间升序排序;遍历会议,如果下一个会议在前一个会议结束之前就开始了,返回 false。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值