-
-
Notifications
You must be signed in to change notification settings - Fork 50.5k
Expand file tree
/
Copy pathmerge_intervals.py
More file actions
61 lines (49 loc) · 1.81 KB
/
merge_intervals.py
File metadata and controls
61 lines (49 loc) · 1.81 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
def merge_intervals(intervals: list[list[int]]) -> list[list[int]]:
"""
Merge all overlapping intervals.
Each interval is represented as a list of two integers [start, end].
The function merges overlapping intervals and returns a list of
non-overlapping intervals sorted by start time.
Parameters:
intervals (list[list[int]]): A list of intervals.
Returns:
list[list[int]]: A list of merged non-overlapping intervals.
Edge Cases Handled:
- Empty list: returns []
- Single interval: returns the interval itself
- Intervals already sorted or unsorted
- Fully overlapping intervals
- Invalid intervals (e.g., [[]] or intervals not having exactly 2 integers) raise ValueError
Examples:
>>> merge_intervals([[1, 3], [2, 6], [8, 10], [15, 18]])
[[1, 6], [8, 10], [15, 18]]
>>> merge_intervals([[1, 4], [4, 5]])
[[1, 5]]
>>> merge_intervals([[6, 8], [1, 3], [2, 4]])
[[1, 4], [6, 8]]
>>> merge_intervals([])
[]
>>> merge_intervals([[1, 4]])
[[1, 4]]
Time Complexity:
O(n log n) - sorting the intervals, where n is the number of intervals.
Space Complexity:
O(n) - storing the merged intervals.
"""
if not intervals:
return []
for interval in intervals:
msg = f"Each interval must have exactly 2 integers, got {interval}"
if len(interval) != 2:
raise ValueError(msg)
# Sort intervals based on the start time
intervals.sort(key=lambda interval: interval[0])
merged: list[list[int]] = [intervals[0]]
for current in intervals[1:]:
last = merged[-1]
# If current interval overlaps with the last merged interval
if current[0] <= last[1]:
last[1] = max(last[1], current[1])
else:
merged.append(current)
return merged