这个题的意思就是给定多个不相交的区间,然后再给定一个新的区间,经过合并和插入操作,使得新的区间仍然是不相交的有序区间。
这个题的关键就是判断新区间的插入位置,首先将原来的区间放入数组中,肯定是一个有序数组,然后查找新区间的插入位置,如果某个值大于等于新区间起始值,并且该值是一个区间的开头,那么这个新区间的开头肯定不变,如果该值是某个区间的结尾,那么新区间的开头就变为该区间的结尾,相当于就是包含了这个区间。结尾位置的确定同理,然后就可以得到一个待插入的新区间。
重新遍历原来的所有区间,对于与新区间有交集的全部舍弃,只加入一次新区间,因为有交集的区间全部都包含在了新区间中。
最后一个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 }