1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| class Solution { //模拟: //1.插入的区间在首尾 // 1.1 首部分区间 [l0,r0] l0>newR // 1.2 尾部区间,新区间大于旧区间所有区间。 //2.插入的区间在中间 // 2.1 没有重叠区间 [l0,r0] r0<newl [l1,r1], newr<l1 // 2.2 有区间重叠,判断是否可以合并,l1,r1,如果newl<=r1则可以合并,合并后[min(l1,newl),max(r1,newr)] // 2.2.1 新区间覆盖旧区间 // 2.2.2 旧区间覆盖新区间 // 2.2.3 新区间和旧区间正好接上 // 2.2.4 新区间和旧区间有交集 // [[1,2],[3,5],[6,7],[8,10],[12,16]] // [4,8] public int[][] insert(int[][] intervals, int[] newInterval) { int n = intervals.length; List<int[]> ret = new ArrayList<>(); if(n<=0)return new int[][]{{newInterval[0],newInterval[1]}}; int newStart = newInterval[0]; int newEnd = newInterval[1]; boolean hasAdd = false; if(newEnd<intervals[0][0]){//1.1情况:插入到首区间 ret.add(new int[]{newStart,newEnd}); hasAdd = true; } for(int[] interval:intervals){//2.情况:需要判断是否有重合的区间 int start = interval[0]; int end = interval[1];//System.out.println(start+"|"+end+"|"+hasAdd+"|"+newEnd+"|"+newStart); if (hasAdd){//已经添加过了 ret.add(interval); continue; } if (end<newStart){//没有交集 ret.add(interval); } else if(newEnd<start){//与新区间没有交集了 if(!hasAdd){ ret.add(new int[]{newStart,newEnd}); hasAdd = true; } ret.add(interval); }else if(end>=newStart||(newStart<interval[0]&&newEnd>interval[1])){//有交集 newStart = Math.min(start,newStart); newEnd = Math.max(end,newEnd); } } if(!hasAdd)ret.add(new int[]{newStart,newEnd});//1.2情况:插到末尾区间 return ret.toArray(new int[ret.size()][]); } }
|