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.
There are a few standard ways to decide if a single person can attend all meetings. All approaches detect whether any two intervals overlap; if so, return false. It is very similar to Check if Intervals Overlap. Some edge cases, to consider when designing the solution:
Empty list or single interval → true.
Touching intervals like [1,2] and [2,3] are allowed (no overlap) — ensure sort/tie-breakers treat end == start as non-overlapping.
Intervals with invalid input (start >= end) should be validated depending on problem constraints.
Sort intervals by start time and scan left-to-right; a meeting that starts before the previous meeting ends causes a conflict. Example: [(0,30),(5,10)] fails because 5 < 30.
import java.util.*;
classSolution {
publicbooleancanAttendMeetings(int[][] intervals) {
if (intervals ==null|| intervals.length== 0) returntrue;
Arrays.sort(intervals, Comparator.comparingInt(a -> a[0]));
int prev = intervals[0][1];
for (int i = 1; i < intervals.length; i++) {
if (intervals[i][0]< prev) returnfalse;
prev = intervals[i][1];
}
returntrue;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
classSolution {
funcanAttendMeetings(intervals: Array<IntArray>): Boolean {
if (intervals.isEmpty()) returntrue intervals.sortWith(compareBy({ it[0] }, { it[1] }))
var prev = intervals[0][1]
for (i in1 until intervals.size) {
if (intervals[i][0] < prev) returnfalse prev = intervals[i][1]
}
returntrue }
}
1
2
3
4
5
6
7
8
9
10
11
classSolution:
defcanAttendMeetings(self, intervals: list[list[int]]) -> bool:
ifnot intervals:
returnTrue intervals.sort(key=lambda x: x[0])
prev: int = intervals[0][1]
for s, e in intervals[1:]:
if s < prev:
returnFalse prev = e
returnTrue
1
2
3
4
5
6
7
8
9
10
11
12
impl Solution {
pubfncan_attend_meetings(mut intervals: Vec<Vec<i32>>) -> bool {
if intervals.is_empty() { returntrue; }
intervals.sort_by(|a, b| a[0].cmp(&b[0]));
letmut prev = intervals[0][1];
for i in1..intervals.len() {
if intervals[i][0] < prev { returnfalse; }
prev = intervals[i][1];
}
true }
}
1
2
3
4
5
6
7
8
9
10
11
12
classSolution {
publiccanAttendMeetings(intervals: number[][]):boolean {
if (!intervals||intervals.length===0) returntrue;
intervals.sort((a, b) =>a[0] -b[0]);
letprev=intervals[0][1];
for (leti=1; i<intervals.length; i++) {
if (intervals[i][0] <prev) returnfalse;
prev=intervals[i][1];
}
returntrue;
}
}
If intervals are ordered by end time, checking that each next meeting starts after the previous end detects overlaps; ordering by end time is useful when choosing non-overlapping intervals.
import java.util.*;
classSolution {
publicbooleancanAttendMeetings(int[][] intervals) {
if (intervals ==null|| intervals.length== 0) returntrue;
Arrays.sort(intervals, Comparator.comparingInt(a -> a[1]));
int prev = intervals[0][1];
for (int i = 1; i < intervals.length; i++) {
if (intervals[i][0]< prev) returnfalse;
prev = intervals[i][1];
}
returntrue;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
classSolution {
funcanAttendMeetings(intervals: Array<IntArray>): Boolean {
if (intervals.isEmpty()) returntrue intervals.sortWith(compareBy({ it[1] }, { it[0] }))
var prev = intervals[0][1]
for (i in1 until intervals.size) {
if (intervals[i][0] < prev) returnfalse prev = intervals[i][1]
}
returntrue }
}
1
2
3
4
5
6
7
8
9
classSolution:
defcanAttendMeetings(self, intervals: list[list[int]]) -> bool:
ifnot intervals: returnTrue intervals.sort(key=lambda x: x[1])
prev: int = intervals[0][1]
for s, e in intervals[1:]:
if s < prev: returnFalse prev = e
returnTrue
1
2
3
4
5
6
7
8
9
10
11
12
impl Solution {
pubfncan_attend_meetings_by_end(mut intervals: Vec<Vec<i32>>) -> bool {
if intervals.is_empty() { returntrue; }
intervals.sort_by(|a, b| a[1].cmp(&b[1]));
letmut prev = intervals[0][1];
for i in1..intervals.len() {
if intervals[i][0] < prev { returnfalse; }
prev = intervals[i][1];
}
true }
}
1
2
3
4
5
6
7
8
9
10
11
12
classSolution {
publiccanAttendMeetings(intervals: number[][]):boolean {
if (!intervals||intervals.length===0) returntrue;
intervals.sort((a, b) =>a[1] -b[1]);
letprev=intervals[0][1];
for (leti=1; i<intervals.length; i++) {
if (intervals[i][0] <prev) returnfalse;
prev=intervals[i][1];
}
returntrue;
}
}
Convert intervals into start/end events and scan time-ordered events; if more than one meeting is active at any point, there is a conflict. Treat an end at time t as happening before a start at t to allow touching intervals.
import java.util.*;
classSolution {
publicbooleancanAttendMeetings(int[][] intervals) {
List<int[]> events =new ArrayList<>();
for (int[] it : intervals) {
events.add(newint[]{it[0], 1});
events.add(newint[]{it[1], -1});
}
events.sort((a, b) -> {
if (a[0]!= b[0]) return a[0]- b[0];
return a[1]- b[1];
});
int active = 0;
for (int[] e : events) {
active += e[1];
if (active > 1) returnfalse;
}
returntrue;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
classSolution {
funcanAttendMeetings(intervals: Array<IntArray>): Boolean {
val events = mutableListOf<Pair<Int, Int>>()
for (itin intervals) {
events.add(Pair(it[0], 1))
events.add(Pair(it[1], -1))
}
events.sortWith(compareBy({ it.first }, { it.second }))
var active = 0for ((_, d) in events) {
active += d
if (active > 1) returnfalse }
returntrue }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
classSolution:
defcanAttendMeetings(self, intervals: list[list[int]]) -> bool:
events: list[tuple[int,int]] = []
for s, e in intervals:
events.append((s, 1))
events.append((e, -1))
events.sort(key=lambda x: (x[0], x[1]))
active: int =0for _, d in events:
active += d
if active >1:
returnFalsereturnTrue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
impl Solution {
pubfncan_attend_meetings_events(intervals: Vec<Vec<i32>>) -> bool {
letmut events: Vec<(i32,i32)>= Vec::with_capacity(intervals.len()*2);
for it in intervals {
events.push((it[0], 1));
events.push((it[1], -1));
}
events.sort_by(|a,b|if a.0!= b.0 { a.0.cmp(&b.0) } else { a.1.cmp(&b.1) });
letmut active =0;
for (_t, d) in events {
active += d;
if active >1 { returnfalse; }
}
true }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
classSolution {
publiccanAttendMeetings(intervals: number[][]):boolean {
constevents: [number, number][] = [];
for (constitofintervals) {
events.push([it[0], 1]);
events.push([it[1], -1]);
}
events.sort((a, b) =>a[0] -b[0] ||a[1] -b[1]);
letactive=0;
for (const [, d] ofevents) {
active+=d;
if (active>1) returnfalse;
}
returntrue;
}
}