Insert Interval
Given a set of _non-overlapping _intervals, insert a new interval into the intervals (merge if necessary).
You may assume that the intervals were initially sorted according to their start times.
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]]
Explanation: Because the new interval [4,8] overlaps with [3,5],[6,7],[8,10].
Analysis
可以看成是Merge Intervals 的follow-up。这一问里non-overlapping, sorted的前提假设简直就是为了第一问准备的。
有了前一个问题的解法基础,那么这里的的区别就是在于何时插入新的interval。
因为排过序,用一个循环查找插入位置即可。时间复杂度:O(n)
插入操作java.util.ArrayList.add(),时间复杂度: O(n)
之后再进行Merge Intervals中完全一样的操作即可,时间复杂度:O(n)
空间复杂度,因为有额外的存储最终答案的ArrayList,空间复杂度为: O(n)
Solution
(13ms, 64%)
/**
* Definition for an interval.
* public class Interval {
* int start;
* int end;
* Interval() { start = 0; end = 0; }
* Interval(int s, int e) { start = s; end = e; }
* }
*/
class Solution {
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
List<Interval> ans = new ArrayList<>();
int index = 0;
while (index < intervals.size()) {
if (newInterval.start > intervals.get(index).start) {
index++;
} else {
break;
}
}
intervals.add(index, newInterval);
Interval last = null;
for (Interval interval : intervals) {
if (last == null || interval.start > last.end) {
ans.add(interval);
last = interval;
} else {
last.end = Math.max(last.end, interval.end);
}
}
return ans;
}
}
Last updated
Was this helpful?