1. Problem Statement
You are given a list of non-overlapping intervals sorted by their start time. You are also given a new interval that needs to be inserted into the list. Insert the new interval such that the list remains sorted and non-overlapping. If necessary, merge overlapping intervals.
Constraints
The list is already sorted by interval start times.
Intervals are non-overlapping before insertion.
You need to maintain the sorted order and ensure no overlapping intervals in the result.
Example
Input:
Intervals = [[1, 3], [6, 9]] New Interval = [2, 5]
Output:
[[1, 5], [6, 9]]
Explaination:
The new interval [2, 5] overlaps with [1, 3]. They merge into [1, 5].
2. Intuition and Approach
We handle the problem in three phases:
- Add intervals that come before the new interval (no overlap).
- Merge all intervals that overlap with the new interval.
- Add intervals that come after the new interval (no overlap).
3. Step-by-Step Explanation
Let’s assume the input is a list of intervals intervals and a new interval newInterval.
Step 1: Initialize
- Create a result list
result = []. - Use an index
i = 0to iterate through the input list.
Step 2: Add All Intervals Before the New Interval
Add all intervals that end before the new interval starts. These can’t overlap.
while (i < intervals.length && intervals[i][1] < newInterval[0]) {
result.add(intervals[i]);
i++;
}
Step 3: Merge Overlapping Intervals
While there is overlap, keep merging:
- The condition for overlap is:
interval[i][0] <= newInterval[1] - Update the new interval to reflect the merged interval:
newInterval[0] = min(newInterval[0], intervals[i][0])newInterval[1] = max(newInterval[1], intervals[i][1])
while (i < intervals.length && intervals[i][0] <= newInterval[1]) {
newInterval[0] = Math.min(newInterval[0], intervals[i][0]);
newInterval[1] = Math.max(newInterval[1], intervals[i][1]);
i++;
}
result.add(newInterval); // insert the merged interval
Step 4: Add Remaining Intervals
Add all the intervals after the merged interval.
while (i < intervals.length) {
result.add(intervals[i]);
i++;
}
4. Java Implementation
import java.util.*;
public class InsertInterval {
public static int[][] insert(int[][] intervals, int[] newInterval) {
List<int[]> result = new ArrayList<>();
int i = 0;
// Step 1: Add intervals before the new interval
while (i < intervals.length && intervals[i][1] < newInterval[0]) {
result.add(intervals[i]);
i++;
}
// Step 2: Merge overlapping intervals
while (i < intervals.length && intervals[i][0] <= newInterval[1]) {
newInterval[0] = Math.min(newInterval[0], intervals[i][0]);
newInterval[1] = Math.max(newInterval[1], intervals[i][1]);
i++;
}
result.add(newInterval);
// Step 3: Add remaining intervals
while (i < intervals.length) {
result.add(intervals[i]);
i++;
}
return result.toArray(new int[result.size()][]);
}
public static void main(String[] args) {
int[][] intervals = {{1, 3}, {6, 9}};
int[] newInterval = {2, 5};
int[][] result = insert(intervals, newInterval);
for (int[] interval : result) {
System.out.print(Arrays.toString(interval) + " ");
}
}
}
