问题描述:
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].
分析:该题与l-56很类似,首先,明确这样几点:
- 在插入newInterval之前,intervals是有序的,且没有overlapping,所以可以直接添加。
- 当检查到可以添加newInterval时,需要与顶部元素进行比较。因此,不妨统一赋值给current,减少代码量。
- 当插入到newInterval后,后面插入的每个元素都要检查与顶部元素的比较。
代码如下:392ms
/**
* 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> res = new LinkedList<Interval>();
int length = intervals.size();
if(length<=0){
res.add(newInterval);
return res;
}
boolean filled = false;
for(int i = 0;i<length;i++){
Interval current = intervals.get(i);
if(!filled && current.start>=newInterval.start){
current = newInterval;
filled = true;
i--;
}else if(!filled)
res.add(current);
if(filled){
if(res.isEmpty()){
res.add(current);
continue;
}
Interval top = res.get(res.size()-1);
if(top.end>=current.start)
top.end = Math.max(top.end,current.end);
else
res.add(current);
}
}
if(!filled){
Interval top = res.get(res.size()-1);
if(top.end>=newInterval.start)
top.end = Math.max(top.end,newInterval.end);
else
res.add(newInterval);
}
return res;
}
}