Skip to content

Commit 5a4e8c8

Browse files
committed
Merge intervals
1 parent 4d53e38 commit 5a4e8c8

3 files changed

Lines changed: 118 additions & 1 deletion

File tree

codes/merge_intervals.mojo

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
### Merge Itervals
2+
### Merge overlapping intervals
3+
4+
5+
@parameter
6+
fn compare_fn(interval1: (Int, Int), interval2: (Int, Int)) -> Bool:
7+
return interval1[0] < interval2[0]
8+
9+
10+
fn merge_intervals(mut intervals: List[(Int, Int)]) -> List[(Int, Int)]:
11+
if len(intervals) == 0:
12+
return List[(Int, Int)]()
13+
14+
sort[compare_fn](intervals)
15+
16+
result = List[(Int, Int)]()
17+
result.append(intervals[0])
18+
for curr_interval in intervals[1:]:
19+
start, end = curr_interval[]
20+
last_interval = result[-1]
21+
last_start, last_end = last_interval
22+
if start <= last_end:
23+
result[len(result) - 1] = (last_start, max(last_end, end))
24+
else:
25+
result.append(curr_interval[])
26+
27+
return result
28+
29+
30+
from testing import assert_true
31+
32+
33+
fn main() raises:
34+
intervals = List[(Int, Int)]((1, 3), (2, 6), (8, 10), (15, 18))
35+
expected = List[(Int, Int)]((1, 6), (8, 10), (15, 18))
36+
result = merge_intervals(intervals)
37+
i = 0
38+
for each in result:
39+
assert_true(
40+
each[][0] == expected[i][0] and each[][1] == expected[i][1],
41+
"Assertion failed",
42+
)
43+
i += 1
44+
45+
intervals = List[(Int, Int)]((1, 4), (4, 5))
46+
expected = List[(Int, Int)]((1, 5))
47+
result = merge_intervals(intervals)
48+
i = 0
49+
for each in result:
50+
assert_true(
51+
each[][0] == expected[i][0] and each[][1] == expected[i][1],
52+
"Assertion failed",
53+
)
54+
i += 1

docs/index.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,4 +67,6 @@
6767

6868
🟢 [Find All Anagrams in a String](all_anagrams.md) ➔ Return all start indices of anagrams of string p in string s.
6969

70-
🟢 [Find First/Last](find_first_last.md) ➔ Find first and last index of a target value in a sorted array
70+
🟢 [Find First/Last](find_first_last.md) ➔ Find first and last index of a target value in a sorted array
71+
72+
🟢 [Merge Itervals](merge_intervals.md) ➔ Merge overlapping intervals

docs/merge_intervals.md

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
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

Comments
 (0)