|
| 1 | +### Merge Itervals |
| 2 | +### Merge overlapping intervals |
| 3 | + |
| 4 | +```python |
| 5 | + |
| 6 | + |
| 7 | +@parameter |
| 8 | +fn compare_fn(interval1: (Int, Int), interval2: (Int, Int)) -> Bool: |
| 9 | + return interval1[0] < interval2[0] |
| 10 | + |
| 11 | + |
| 12 | +fn merge_intervals(mut intervals: List[(Int, Int)]) -> List[(Int, Int)]: |
| 13 | + if len(intervals) == 0: |
| 14 | + return List[(Int, Int)]() |
| 15 | + |
| 16 | + sort[compare_fn](intervals) |
| 17 | + |
| 18 | + result = List[(Int, Int)]() |
| 19 | + result.append(intervals[0]) |
| 20 | + for curr_interval in intervals[1:]: |
| 21 | + start, end = curr_interval[] |
| 22 | + last_interval = result[-1] |
| 23 | + last_start, last_end = last_interval |
| 24 | + if start <= last_end: |
| 25 | + result[len(result) - 1] = (last_start, max(last_end, end)) |
| 26 | + else: |
| 27 | + result.append(curr_interval[]) |
| 28 | + |
| 29 | + return result |
| 30 | + |
| 31 | + |
| 32 | +from testing import assert_true |
| 33 | + |
| 34 | + |
| 35 | +fn main() raises: |
| 36 | + intervals = List[(Int, Int)]((1, 3), (2, 6), (8, 10), (15, 18)) |
| 37 | + expected = List[(Int, Int)]((1, 6), (8, 10), (15, 18)) |
| 38 | + result = merge_intervals(intervals) |
| 39 | + i = 0 |
| 40 | + for each in result: |
| 41 | + assert_true( |
| 42 | + each[][0] == expected[i][0] and each[][1] == expected[i][1], |
| 43 | + "Assertion failed", |
| 44 | + ) |
| 45 | + i += 1 |
| 46 | + |
| 47 | + intervals = List[(Int, Int)]((1, 4), (4, 5)) |
| 48 | + expected = List[(Int, Int)]((1, 5)) |
| 49 | + result = merge_intervals(intervals) |
| 50 | + i = 0 |
| 51 | + for each in result: |
| 52 | + assert_true( |
| 53 | + each[][0] == expected[i][0] and each[][1] == expected[i][1], |
| 54 | + "Assertion failed", |
| 55 | + ) |
| 56 | + i += 1 |
| 57 | + |
| 58 | +``` |
| 59 | + |
| 60 | + |
| 61 | +[Source](https://github.com/ratulb/mojo_programming/blob/main/codes/merge_intervals.mojo) |
0 commit comments