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]
.
新区间和老区间的关系无非有三种:
1.新区间的start大于老区间的end,即新区间在老区间之后,两者无交集。这种情况将老区间加入结果集。
2.新区间的end小于老区间的start,即新区间在老区间之前,两者无交集。这种情况将老区间加入结果集(此种情况一定是发生在merge之后的,所以加入老区间之前一定要把merge的结果先加入)。
3.merge情况,新区间的start小于等于老区间的end,即两者有交集。这种情况,就merge二者,取二者的并集作为新区间(这个新区间大于等于原始的新区间,但不会对以后的新老区间合并产生错误,因为题设已经假设了给的区间之前无交集)。如果测试数据中有多个区间和原始新区间有交集的话,这条的执行结果会使这个新区间不断的增大,直至将所有的有交集的都合并(如果测试用例中是[1,5],[2,3]这种情况,老区间包含新区间,也会将[1,5]和[2,3]合并并且将合并结果[1,5]作为新区间返回)。
Source
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
if(intervals.size() < 1){ //intervals为空时,返回带newInterval的list
intervals.add(newInterval);
return intervals;
}
List<Interval> a = new ArrayList<Interval>();
for(int i = 0; i < intervals.size(); i++){
Interval cur = intervals.get(i);
if(cur.end < newInterval.start){ //cur在newInterval之前且无交集
a.add(cur);
}
else if(newInterval.end < cur.start){ //cur在newInterval之后且无交集
a.add(newInterval);
newInterval = cur;
//这里将cur赋值给newInterval是为了可以在for循环外执行a.add(newInterval);
//假如是Intervals为[[1,5]],newInterval为[2,3]这种情况,根本不会执行到这条if,那么newInterval就无法正常输出,为了统一管理,将最后一条在for以外输出
}
else if(newInterval.start <= cur.end){ //cur与newInterval有交集的情况
Interval merge = new Interval(Math.min(newInterval.start, cur.start), Math.max(newInterval.end, cur.end));
newInterval = merge; //仅更新newInterval 不加入结果集 直至cur与newInterval再无交集时再加 这样可以避免加入中间结果而非最终的结果
}
}
a.add(newInterval);
return a;
}
Test
public static void main(String[] args){
Interval a = new Interval(1, 5);
List<Interval> list = new ArrayList<Interval>();
list.add(a);
// a = new Interval(3, 5);
// list.add(a);
// a = new Interval(6, 7);
// list.add(a);
// a = new Interval(8, 10);
// list.add(a);
// a = new Interval(12, 16);
// list.add(a);
Interval newInterval = new Interval(2, 3);
list = new Solution().insert(list, newInterval);
for(int i = 0; i < list.size(); i++){
System.out.println(list.get(i).start + " " + list.get(i).end);
}
}