252. Meeting Rooms


Given an array of meeting time intervals consisting of start and end times [[s1,e1],[s2,e2],…] (si < ei), determine if a person could attend all meetings.

Example 1:

Input: [[0,30],[5,10],[15,20]]
Output: false

Example 2:

Input: [[7,10],[2,4]]
Output: true

方法0: brute force

易错点:

  1. 这都可以overflow
  2. 判断相交的条件
class Solution {
public:
    bool canAttendMeetings(vector<Interval>& intervals) {
        if (intervals.size() == 0) return true;
        for (int i = 0; i < intervals.size() - 1; i ++){
            for (int j = i + 1; j < intervals.size(); j++){
                if (intervals[i].end > intervals[j].start && intervals[i].start < intervals[j].end){
                    return false;
                }
            }
        }
        return true;
    }
};

方法1: sort

思路:

和56,57道理一样。如果把overlap写成一个外部函数的化,速度就会提升很多。why?

Time complexity: sort占据O(nlogn), 剩下的遍历需要O(n)
Space complexity: O(1)

struct Interval {
     int start;
     int end;
     Interval() : start(0), end(0) {}
     Interval(int s, int e) : start(s), end(e) {}
};

class Solution {
public:
    bool canAttendMeetings(vector<Interval>& intervals) {
        auto cmp = [](Interval & a, Interval & b){
            return a.start <= b.start;
        };
        sort(intervals.begin(), intervals.end(), cmp);
        
        for (int i = 1; i < intervals.size(); i ++){
            if (overlap(intervals[i], intervals[i - 1])) return false;
        }
        return true;
    }
    
    bool overlap(Interval & a, Interval & b){
        if (a.start < b.end && a.end > b.start){
            return true;
        }
        return false;
    }
};

二刷:


class Solution {
public:
    bool canAttendMeetings(vector<vector<int>>& intervals) {
        if (intervals.empty()) return true;
        sort(intervals.begin(), intervals.end());
        for (int i = 0; i < intervals.size() - 1; i ++) {
            if (intervals[i][1] > intervals[i + 1][0]) return false;
        }
        return true;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值