Sort and Check Adjacent
Intuition
The straightforward approach is to sort the meetings by their start time, then check if any two consecutive meetings overlap. If a meeting starts before the previous one ends, there is a conflict. After sorting, we only need to check adjacent pairs because any non-adjacent overlap would also be caught by an adjacent overlap. This is because if meeting A overlaps with meeting C but not meeting B (where A < B < C by start time), then B must start after A ends but before C starts, which contradicts A overlapping with C.
Algorithm
- Sort the intervals by start time.
- Iterate from the second interval onward.
- For each interval, check if its start time is less than the previous interval's end time.
- If any overlap is found, return `false`.
- If the loop completes without finding overlaps, return `true`.
O(n log n)SpaceO(1)Code (C++ · Java · Python · Go)
class Solution {
public:
bool canAttendMeetings(vector<vector<int>>& intervals) {
sort(intervals.begin(), intervals.end());
for (int i = 1; i < (int)intervals.size(); i++) {
if (intervals[i][0] < intervals[i - 1][1]) {
return false;
}
}
return true;
}
};class Solution {
public boolean canAttendMeetings(int[][] intervals) {
Arrays.sort(intervals, (a, b) -> a[0] - b[0]);
for (int i = 1; i < intervals.length; i++) {
if (intervals[i][0] < intervals[i - 1][1]) {
return false;
}
}
return true;
}
}def canAttendMeetings(intervals: List[List[int]]) -> bool:
intervals.sort()
for i in range(1, len(intervals)):
if intervals[i][0] < intervals[i - 1][1]:
return False
return Trueimport "sort"
func canAttendMeetings(intervals [][]int) bool {
sort.Slice(intervals, func(i, j int) bool {
return intervals[i][0] < intervals[j][0]
})
for i := 1; i < len(intervals); i++ {
if intervals[i][0] < intervals[i-1][1] {
return false
}
}
return true
}