Intervals
Insert Interval
DESCRIPTION (inspired by Leetcode.com)
You're given a list of intervals intervals that is already sorted by start time and has no overlaps, plus a single interval newInterval. Write a function that returns a new list containing all the intervals after newInterval has been inserted. The returned list must stay sorted by start time and have no overlaps, so any intervals that overlap once newInterval is added should be merged together. You don't need to modify intervals in place; just build and return the result.
Two intervals are considered overlapping if they share any common time, including if one ends exactly when another begins (e.g., [1,4] and [4,7] overlap and should be merged into [1,7]).
Input:
intervals = [[1,3],[6,9]] newInterval = [2,5]
Output:
[[1,5],[6,9]]
Explanation: The new interval [2,5] overlaps with [1,3], so they are merged into [1,5].
Input:
intervals = [[1,2],[3,5],[6,7],[8,10]] newInterval = [5,6]
Output:
[[1,2],[3,7],[8,10]]
Explanation: The new interval [5,6] touches [3,5] and [6,7], so all three are merged into [3,7].
Explanation
- Add all the intervals ending before newInterval starts to merged.
- Merge all overlapping intervals with newInterval and add that merged interval to merged.
- Add all the intervals starting after newInterval to merged.
Phase 1
def insertIntervals(intervals, newInterval):merged = []i = 0n = len(intervals)while i < n and intervals[i][1] < newInterval[0]:merged.append(intervals[i])i += 1while i < n and intervals[i][0] <= newInterval[1]:newInterval[0] = min(intervals[i][0], newInterval[0])newInterval[1] = max(intervals[i][1], newInterval[1])i += 1merged.append(newInterval)for j in range(i, n):merged.append(intervals[j])return merged
initialize variables
0 / 1
Phase 2
def insertIntervals(intervals, newInterval):merged = []i = 0n = len(intervals)while i < n and intervals[i][1] < newInterval[0]:merged.append(intervals[i])i += 1while i < n and intervals[i][0] <= newInterval[1]:newInterval[0] = min(intervals[i][0], newInterval[0])newInterval[1] = max(intervals[i][1], newInterval[1])i += 1merged.append(newInterval)for j in range(i, n):merged.append(intervals[j])return merged
add intervals before newInterval
0 / 4
Phase 3
def insertIntervals(intervals, newInterval):merged = []i = 0n = len(intervals)while i < n and intervals[i][1] < newInterval[0]:merged.append(intervals[i])i += 1while i < n and intervals[i][0] <= newInterval[1]:newInterval[0] = min(intervals[i][0], newInterval[0])newInterval[1] = max(intervals[i][1], newInterval[1])i += 1merged.append(newInterval)for j in range(i, n):merged.append(intervals[j])return merged
j = 4
0 / 2
Test Your Knowledge
Login to take the complexity quiz and track your progress
Complexity Analysis
Time Complexity: O(n) where n is the number of intervals. We iterate through all intervals once to merge them.
Space Complexity: O(n) where n is the number of intervals. We need space for the merged output array.
Solution
def insertIntervals(intervals, newInterval):merged = []i = 0n = len(intervals)while i < n and intervals[i][1] < newInterval[0]:merged.append(intervals[i])i += 1while i < n and intervals[i][0] <= newInterval[1]:newInterval[0] = min(intervals[i][0], newInterval[0])newInterval[1] = max(intervals[i][1], newInterval[1])i += 1merged.append(newInterval)for j in range(i, n):merged.append(intervals[j])return merged
insert interval
0 / 9
Your account is free and you can post anonymously if you choose.