题目来源
题目描述
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。 |