Skip to content

Commit 6d8dbe4

Browse files
committed
solve Insert Interval
1 parent b71ce6b commit 6d8dbe4

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed

problems/insert_interval.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
from typing import List
2+
3+
4+
class Solution:
5+
# Greedy.
6+
# The idea of greedy algorithm is to pick the locally optimal move at each step,
7+
# that will lead to the globally optimal solution.
8+
#
9+
# newInterval can be:
10+
# - ends before start of current interval
11+
# - ends between start and end of current interval
12+
# - starts between start and end of current interval
13+
# - starts after end of current interval
14+
#
15+
# Time: O(n)
16+
# Space: O(n) to keep output.
17+
def insert(
18+
self, intervals: List[List[int]], newInterval: List[int]
19+
) -> List[List[int]]:
20+
merged = False
21+
ans = []
22+
23+
for interval in intervals:
24+
if merged:
25+
ans.append(interval)
26+
27+
# ends before start of current interval
28+
elif newInterval[1] < interval[0]:
29+
ans.append(newInterval)
30+
ans.append(interval)
31+
merged = True
32+
33+
# ends between start and end of current interval
34+
elif interval[0] <= newInterval[1] <= interval[1]:
35+
interval[0] = min(interval[0], newInterval[0])
36+
ans.append(interval)
37+
merged = True
38+
39+
# starts between start and end of current interval
40+
elif interval[0] <= newInterval[0] <= interval[1]:
41+
newInterval = [interval[0], max(newInterval[1], interval[1])]
42+
43+
# starts after end of current interval
44+
elif interval[1] < newInterval[0]:
45+
ans.append(interval)
46+
47+
if not merged:
48+
ans.append(newInterval)
49+
50+
return ans

tests/test_insert_interval.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import unittest
2+
3+
from insert_interval import Solution
4+
5+
6+
class TestInsertInterval(unittest.TestCase):
7+
def test_example_1(self):
8+
assert Solution().insert(intervals=[[1, 3], [6, 9]], newInterval=[2, 5]) == [
9+
[1, 5],
10+
[6, 9],
11+
]
12+
13+
def test_example_2(self):
14+
assert Solution().insert(
15+
intervals=[[1, 2], [3, 5], [6, 7], [8, 10], [12, 16]], newInterval=[4, 8]
16+
) == [[1, 2], [3, 10], [12, 16]]

0 commit comments

Comments
 (0)