Given an array of meeting time intervals intervals where intervals[i] = [starti, endi], determine if a person could attend all meetings.
Input: intervals = [[0,30],[5,10],[15,20]]
Output: false
Explanation: [0,30] overlaps with both [5,10] and [15,20]
Input: intervals = [[7,10],[2,4]]
Output: true
Explanation: No overlaps - person can attend both meetings
Input: intervals = [[0,5],[5,10],[10,15]]
Output: true
Explanation: Meetings are back-to-back with no overlap (touching boundaries are OK)
0 <= intervals.length <= 10^4intervals[i].length == 20 <= starti < endi <= 10^6This is a simpler version of the interval scheduling problem. We need to check if any two meetings overlap.
Sort by start time, then check consecutive meetings for overlap!
If meetings are sorted by start time, overlapping meetings will be adjacent. We only need to check if each meeting starts before the previous one ends.
truecurrent.start < previous.end, return falsetrue if no overlaps foundAfter sorting by start time:
For intervals = [[0,30], [5,10], [15,20]]:
[[0,30], [5,10], [15,20]] (already sorted)[5,10] vs [0,30]: 5 < 30 → Overlap! Return falseFor intervals = [[7,10], [2,4]]:
[[2,4], [7,10]][7,10] vs [2,4]: 7 >= 4 → No overlaptrueTime Complexity: O(n log n)
Space Complexity: O(1) or O(log n)
import java.util.Arrays;
class Solution {
public boolean canAttendMeetings(int[][] intervals) {
// Edge case: empty or single meeting
if (intervals == null || intervals.length <= 1) {
return true;
}
// Sort intervals by start time
Arrays.sort(intervals, (a, b) -> Integer.compare(a[0], b[0]));
// Check for overlaps
for (int i = 1; i < intervals.length; i++) {
// If current meeting starts before previous ends
if (intervals[i][0] < intervals[i - 1][1]) {
return false; // Overlap detected
}
}
return true; // No overlaps
}
}
def canAttendMeetings(intervals: List[List[int]]) -> bool:
# Edge case
if not intervals or len(intervals) <= 1:
return True
# Sort by start time
intervals.sort(key=lambda x: x[0])
# Check for overlaps
for i in range(1, len(intervals)):
# If current starts before previous ends
if intervals[i][0] < intervals[i - 1][1]:
return False # Overlap detected
return True # No overlaps
This problem demonstrates:
start < prevEnd (not <=)[1,5] and [5,10] do NOT overlap (touching is OK)