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
NOTE: input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature.
這道題給了我們一堆會議的時間,問能不能同時參見所有的會議,這實際上就是求區間是否有交集的問題,那么最簡單暴力的方法就是每兩個區間比較一下,看是否有 overlap,有的話直接返回 false 就行了。比較兩個區間a和b是否有 overlap,可以檢測兩種情況,如果a的起始位置大於等於b的起始位置,且此時a的起始位置小於b的結束位置,則一定有 overlap,另一種情況是a和b互換個位置,如果b的起始位置大於等於a的起始位置,且此時b的起始位置小於a的結束位置,那么一定有 overlap,參見代碼如下:
解法一:
class Solution { public: bool canAttendMeetings(vector<vector<int>>& intervals) { for (int i = 0; i < intervals.size(); ++i) { for (int j = i + 1; j < intervals.size(); ++j) { if ((intervals[i][0] >= intervals[j][0] && intervals[i][0] < intervals[j][1]) || (intervals[j][0] >= intervals[i][0] && intervals[j][0] < intervals[i][1])) return false; } } return true; } };
我們可以先給所有區間排個序,用起始時間的先后來排,然后從第二個區間開始,如果開始時間早於前一個區間的結束時間,則說明會議時間有沖突,返回 false,遍歷完成后沒有沖突,則返回 true,參見代碼如下:
解法二:
class Solution { public: bool canAttendMeetings(vector<vector<int>>& intervals) { sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b){return a[0] < b[0];}); for (int i = 1; i < intervals.size(); ++i) { if (intervals[i][0] < intervals[i - 1][1]) { return false; } } return true; } };
Github 同步地址:
https://github.com/grandyang/leetcode/issues/252
類似題目:
參考資料:
https://leetcode.com/problems/meeting-rooms/
https://leetcode.com/problems/meeting-rooms/discuss/67782/C%2B%2B-sort
https://leetcode.com/problems/meeting-rooms/discuss/67786/AC-clean-Java-solution