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
易错点:
- 这都可以overflow
- 判断相交的条件
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;
}
};