这个题的意思就是给定多个不相交的区间,然后再给定一个新的区间,经过合并和插入操作,使得新的区间仍然是不相交的有序区间。

  这个题的关键就是判断新区间的插入位置,首先将原来的区间放入数组中,肯定是一个有序数组,然后查找新区间的插入位置,如果某个值大于等于新区间起始值,并且该值是一个区间的开头,那么这个新区间的开头肯定不变,如果该值是某个区间的结尾,那么新区间的开头就变为该区间的结尾,相当于就是包含了这个区间。结尾位置的确定同理,然后就可以得到一个待插入的新区间。

  重新遍历原来的所有区间,对于与新区间有交集的全部舍弃,只加入一次新区间,因为有交集的区间全部都包含在了新区间中。

  最后一个if判断是当新区间大于原先所有区间时,直接添加在后面,而不会在for循环中被添加。其实这个可以一开始就做,就是当新区间的起始值大于最后一个区间的结尾值时,直接添加,然后退出就可以了,但是放在这里反正也没有TLE,就这样吧,具体代码如下:

  

 1 class Interval {
 2     int start;
 3     int end;
 4     Interval() { start = 0; end = 0; }
 5     Interval(int s, int e) { start = s; end = e; }
 6 }
 7 
 8 public class InsertInterval {
 9 
10     public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
11         if(intervals==null||intervals.size()==0){
12             intervals = new ArrayList<Interval>();
13             intervals.add(newInterval);
14             return intervals;
15         }
16        int [] seq = new int[intervals.size()*2+2];
17        boolean [] isStart = new boolean[intervals.size()*2+2];
18        for(int i=0,j=0;i<intervals.size();i++){
19            seq[j++] = intervals.get(i).start;
20            isStart[j-1] = true;
21            seq[j++] = intervals.get(i).end;
22            isStart[j-1] = false;
23        }
24        int start = newInterval.start;
25        int end = newInterval.end;
26        boolean findStart=false;
27        for(int i=0;i<seq.length;i++){
28            if(!findStart&&seq[i]>=start){
29                if(!isStart[i]){
30                    //处于一个interval的起始和终结之间
31                    start = seq[i-1];
32                    findStart = true;
33                }else{
34                    findStart = true;
35                }
36            }
37            if(findStart&&seq[i]>end){
38                if(!isStart[i]){
39                    end = seq[i];
40                    break;
41                }else{
42                    break;
43                }
44            }else if(findStart&&seq[i]==end){
45                if(!isStart[i]){
46                    end = seq[i];
47                    break;
48                }else{
49                    end = seq[i+1];
50                    break;
51                }
52            }
53        }
54        
55        Interval added = new Interval(start,end);
56        boolean add = false;
57        ArrayList<Interval> newList = new ArrayList<Interval>();
58        for(int i=0;i<intervals.size();i++){
59            Interval temp = intervals.get(i);
60            if(temp.end<added.start){
61                newList.add(temp);
62            }else 
63            if(((temp.end>=added.start&&temp.start<=added.start)||(temp.start<=added.end&&temp.end>=added.end)||(temp.start>=added.start&&temp.end<=added.end))&&!add){
64                add = true;
65                newList.add(added);
66            }else 
67            if(temp.start>added.end){
68                if(!newList.contains(added)){
69                    newList.add(added);
70                }
71                newList.add(temp);
72            }
73        }
74        if(!newList.contains(added)){
75            newList.add(added);
76        }
77        intervals = newList;
78        return intervals;
79     }
80 }