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:
Given intervals [1,3],[6,9], insert and merge [2,5] in as [1,5],[6,9].
Example 2:
Given [1,2],[3,5],[6,7],[8,10],[12,16], insert and merge [4,9] in as [1,2],[3,10],[12,16].
This is because the new interval [4,9]
overlaps with [3,5],[6,7],[8,10]
.
一刷
题解:
与56类似,但是list传入的时候已经是sorted并且non-overlap,所以把新需要插入的interval作为last interval来进行比较
Time Complexity O(n), space complexity O(1)
/**
* 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; }
* }
*/
public class Solution {
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
if(intervals == null || newInterval == null) return intervals;
List<Interval> res = new ArrayList<>();
for(int i=0; i<intervals.size(); i++){
Interval cur = intervals.get(i);
if(cur.end < newInterval.start) res.add(cur);
else if(cur.start > newInterval.end){
res.add(newInterval);
newInterval = cur;
}
else{
newInterval.start = Math.min(cur.start, newInterval.start);
newInterval.end = Math.max(cur.end, newInterval.end);
}
}
res.add(newInterval);
return res;
}
}
二刷
首先把与newInterval没有重叠的前半部分加入结果集中,然后和newInter做merge, 再把与newInterval没有重叠的后半部分加入结果集中
/**
* 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; }
* }
*/
public class Solution {
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
List<Interval> result = new LinkedList<>();
int i = 0;
// add all the intervals ending before newInterval starts
while (i < intervals.size() && intervals.get(i).end < newInterval.start)
result.add(intervals.get(i++));
// merge all overlapping intervals to one considering newInterval
while (i < intervals.size() && intervals.get(i).start <= newInterval.end) {
newInterval.start = Math.min(newInterval.start, intervals.get(i).start);
newInterval.end = Math.max(newInterval.end, intervals.get(i).end);
i++;
}
result.add(newInterval); // add the union of intervals we got
// add all the rest
while (i < intervals.size()) result.add(intervals.get(i++));
return result;
}
}