题目:
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]
.
这道题和leetcode 56题 merge intervals是兄弟题,这道题是给一系列interval的区间,这个区间是相互没有重叠的,这时候插入一个Interval 插入之后 若有重叠了,则进行合并。
思路:
先是新建结果集ls,判断原有集合intervals是否为空,若为空,直接把newInterval加入ls,返回。否则开始判断情况,遍历原有集合intervals,如果newInterval的end小于第i个interval的start,就把newInterval加入结果集ls;如果newInterval的start大于第i个的end,z则就把第i个加入结果集ls中,其他情况,则需要比较第i个和newInterval来进行合并。start选两者中最小的,end选两者中最大的。
开始自己写的时候,走入了一个误区,考虑着好多种情况啊,万一这个newInterval小于第0个,结果end不确定,可以排在最前面,可能需要合并两个,可能需要合并三个,还有start大于的情况,合并的情况这么多怎么办……试着写了几个if判断语句思路就狗带了。其实是自己想的太远了,虽说也是遍历着比较,但是自己想一下子把需要合并的情况弄出来。思路不明确。其实应该是在遍历intervals的循环中,一步一步的考虑,每一步只需要考虑这次是往结果集里加current 还是newInterval,还是需要合并一下这两个,循环结束经历过每一步的比较,也就出来结果了。
最后循环到最后一次,也就是intervals.size()-1的时候,进入这三种情况的比较之后,不会再进入循环了,最后再把这个newInterval加入结果集ls中。
/**
* 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> ls = new ArrayList<Interval>();
if(intervals==null || intervals.size()<1) {
ls.add(newInterval); return ls;}
for(int i=0;i<intervals.size();i++){
Interval curr = intervals.get(i);
if(newInterval.end<curr.start){
ls.add(newInterval);
// ls.add(curr); //开始多了这句话,wrong answer
for(int j=i;j<intervals.size();j++){
ls.add(intervals.get(j));
}
break;
}else if(newInterval.start>curr.end){
ls.add(curr);
}else{
newInterval.start=Math.min(curr.start,newInterval.start);
newInterval.end=Math.max(curr.end,newInterval.end);
}
if(i==intervals.size()-1){
ls.add(newInterval);
}
}
return ls;
}
}