Maybe you could sort the intervals by their start values and then subsequently check if each interval should be merged or not:
from typing import NamedTuple
from prettytable import PrettyTable
def merged_intervals(intervals: list[list[int]]) -> list[list[int]]:
if not intervals:
return []
sorted_intervals = sorted(intervals, key=lambda i: i[0])
merged = [sorted_intervals[0]]
for start, end in sorted_intervals[1:]:
if merged[-1][1] >= start:
merged[-1][1] = max(merged[-1][1], end)
else:
merged.append([start, end])
return merged
class TestCase(NamedTuple):
intervals: list[list[int]]
expected: list[list[int]]
def main() -> None:
t = PrettyTable(['intervals', 'expected', 'actual'])
t.align = 'l'
for intervals, expected in [TestCase([[1, 3], [2, 4]], [[1, 4]]),
TestCase([[1, 3], [4, 5]], [[1, 3], [4, 5]]),
TestCase([[1, 3], [3, 4], [5, 8], [6, 10]],
[[1, 4], [5, 10]])]:
t.add_row([intervals, expected, merged_intervals(intervals)])
print(t)
if __name__ == '__main__':
main()
Output:
+-----------------------------------+-------------------+-------------------+
| intervals | expected | actual |
+-----------------------------------+-------------------+-------------------+
| [[1, 4], [2, 4]] | [[1, 4]] | [[1, 4]] |
| [[1, 3], [4, 5]] | [[1, 3], [4, 5]] | [[1, 3], [4, 5]] |
| [[1, 4], [3, 4], [5, 8], [6, 10]] | [[1, 4], [5, 10]] | [[1, 4], [5, 10]] |
+-----------------------------------+-------------------+-------------------+