85. Insert Interval
intervals is sorted by start and has no overlaps. Insert newInterval, merging where needed, and return the result (still sorted, without overlaps).
Example 1
Input:
intervals = [[1,3],[6,9]], newInterval = [2,5]Output:
[[1,5],[6,9]]Example 2
Input:
intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8]Output:
[[1,2],[3,10],[12,16]]Hint 1
Three phases: intervals ending before the new one, intervals overlapping it, and the rest.
Approach 1: Linear three-phase scan ✅
Copy, absorb, copy.
⏱ Time O(n)💾 Space O(n)
Reference solution for Linear three-phase scan (time O(n), space O(n)). Each solution passes every test in all four languages.
class Solution:
def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
res, i, n = [], 0, len(intervals)
s, e = newInterval
while i < n and intervals[i][1] < s: # entirely before
res.append(intervals[i]); i += 1
while i < n and intervals[i][0] <= e: # overlapping: absorb
s, e = min(s, intervals[i][0]), max(e, intervals[i][1]); i += 1
res.append([s, e])
res.extend(intervals[i:]) # entirely after
return resclass Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
List<int[]> res = new ArrayList<>();
int i = 0, n = intervals.length, s = newInterval[0], e = newInterval[1];
while (i < n && intervals[i][1] < s) res.add(intervals[i++]);
while (i < n && intervals[i][0] <= e) { s = Math.min(s, intervals[i][0]); e = Math.max(e, intervals[i][1]); i++; }
res.add(new int[]{s, e});
while (i < n) res.add(intervals[i++]);
return res.toArray(new int[0][]);
}
}class Solution {
public:
vector<vector<int>> insert(vector<vector<int>>& intervals, vector<int>& newInterval) {
vector<vector<int>> res;
int i = 0, n = intervals.size(), s = newInterval[0], e = newInterval[1];
while (i < n && intervals[i][1] < s) res.push_back(intervals[i++]);
while (i < n && intervals[i][0] <= e) { s = min(s, intervals[i][0]); e = max(e, intervals[i][1]); i++; }
res.push_back({s, e});
while (i < n) res.push_back(intervals[i++]);
return res;
}
};function insert(intervals, newInterval) {
const res = [];
let i = 0, [s, e] = newInterval;
while (i < intervals.length && intervals[i][1] < s) res.push(intervals[i++]);
while (i < intervals.length && intervals[i][0] <= e) { s = Math.min(s, intervals[i][0]); e = Math.max(e, intervals[i][1]); i++; }
res.push([s, e]);
while (i < intervals.length) res.push(intervals[i++]);
return res;
}Try solving it yourself first. Interviewers care more about how you explain the approach than about the finished code.
Watch the core idea of this problem step by step. Change the input and press Visualize.
Explained in the lesson Greedy & Intervals.
Run your code to see results here.