57. 插入区间
题目:
思路:
【1】用指针去扫 intervals,最多可能有三个阶段:
1)不重叠的绿区间,在蓝区间的左边
2)有重叠的绿区间
3)不重叠的绿区间,在蓝区间的右边
代码展示:
//时间1 ms 击败 95.56% //内存42.8 MB 击败 86.3% //时间复杂度:O(n),其中 n 是数组 intervals 的长度,即给定的区间个数。 //空间复杂度:O(1)。除了存储返回答案的空间以外,我们只需要额外的常数空间即可。 class Solution { public int[][] insert(int[][] intervals, int[] newInterval) { int[][] ans; List<int[]> ansList = new ArrayList<>(); int i = 0 , n = intervals.length; // 将数据分成三部分 // 第一部分该区间左边不相交部分 while (i < n && intervals[i][1] < newInterval[0]){ // 加入后,指针移动右移 ansList.add(intervals[i++]); } // 第二部分该区间相交部分,相交部分要进行合并 while (i < n && intervals[i][0] <= newInterval[1]){ // 取合并的两区间的两边的边界值 newInterval[0] = Math.min(newInterval[0],intervals[i][0]); newInterval[1] = Math.max(newInterval[1],intervals[i][1]); i++; } // 合并完后放入结果集中 ansList.add(newInterval); // 第三部分该区间右边不相交部分 while (i < n && intervals[i][0] > newInterval[1]){ // 加入后,指针移动右移 ansList.add(intervals[i++]); } ans = new int[ansList.size()][2]; for (i = 0; i < ansList.size(); i++) { ans[i] = ansList.get(i); } return ans; } } //时间0 ms 击败 100% //内存42.8 MB 击败 86.54% class Solution { public int[][] insert(int[][] intervals, int[] newInterval) { int left = newInterval[0], right = newInterval[1]; boolean flag = false; List<int[]> list = new ArrayList<>(); for (int[] interval : intervals) { if (interval[0] > right) { if (!flag) { list.add(new int[]{left, right}); flag = true; } list.add(interval); } else if (interval[1] < left) { list.add(interval); } else { left = Math.min(left, interval[0]); right = Math.max(right, interval[1]); } } if (!flag) { list.add(new int[]{left, right}); } int[][] res = new int[list.size()][]; for (int i = 0; i < list.size(); ++i) { res[i] = list.get(i); } return res; } }