|
| 1 | +package com.leetcode_cn.hard; |
| 2 | + |
| 3 | +import java.util.Arrays; |
| 4 | + |
| 5 | +/******************插入区间***********/ |
| 6 | +/** |
| 7 | + * 给出一个无重叠的 ,按照区间起始端点排序的区间列表。 |
| 8 | + * |
| 9 | + * 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。 |
| 10 | + * |
| 11 | + * 示例 1: |
| 12 | + * |
| 13 | + * 输入: intervals = [[1,3],[6,9]], newInterval = [2,5] |
| 14 | + * |
| 15 | + * 输出: [[1,5],[6,9]] |
| 16 | + * |
| 17 | + * 示例 2: |
| 18 | + * |
| 19 | + * 输入: intervals = [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval = [4,8] |
| 20 | + * |
| 21 | + * 输出: [[1,2],[3,10],[12,16]] |
| 22 | + * |
| 23 | + * 解释: 这是因为新的区间 [4,8] 与 [3,5],[6,7],[8,10] 重叠。 |
| 24 | + * |
| 25 | + * @author ffj |
| 26 | + * |
| 27 | + */ |
| 28 | +public class InsertInterval { |
| 29 | + public static void main(String[] args) { |
| 30 | + int[][] intervals = { { 1, 3 }, { 6, 9 } }; |
| 31 | + int[] newInterval = { 2, 5 }; |
| 32 | + int[][] result = new InsertInterval().insert(intervals, newInterval); |
| 33 | + System.out.println(result); |
| 34 | + } |
| 35 | + |
| 36 | + public int[][] insert(int[][] intervals, int[] newInterval) { |
| 37 | + |
| 38 | + int[][] retArr; |
| 39 | + |
| 40 | + int newStart = newInterval[0]; |
| 41 | + int newEnd = newInterval[1]; |
| 42 | + int si = -1, ei = -1; |
| 43 | + boolean sFind = false, eFind = false; |
| 44 | + for (int i = 0; i < intervals.length; i++) { |
| 45 | + int[] item = intervals[i]; |
| 46 | + int itemStart = item[0]; |
| 47 | + int itemEnd = item[1]; |
| 48 | + if (si == -1) { |
| 49 | + if (newStart <= itemEnd) { |
| 50 | + si = i; |
| 51 | + if (newStart >= itemStart) { |
| 52 | + sFind = true; |
| 53 | + } |
| 54 | + } |
| 55 | + } |
| 56 | + if (ei == -1) { |
| 57 | + if (newEnd <= itemEnd) { |
| 58 | + ei = i; |
| 59 | + if (newEnd >= itemStart) { |
| 60 | + eFind = true; |
| 61 | + } |
| 62 | + } |
| 63 | + } |
| 64 | + if (si != -1 && ei != -1) { |
| 65 | + break; |
| 66 | + } |
| 67 | + } |
| 68 | + // 插入or合并区间 |
| 69 | + if (si == -1 && ei == -1) { |
| 70 | + // 插入最后 |
| 71 | + retArr = Arrays.copyOf(intervals, intervals.length + 1); |
| 72 | + retArr[intervals.length] = new int[] { newStart, newEnd }; |
| 73 | + } else if (si == ei) { |
| 74 | + int[] temp = new int[2]; |
| 75 | + if (!sFind) { |
| 76 | + temp[0] = newStart; |
| 77 | + } else { |
| 78 | + temp[0] = intervals[si][0]; |
| 79 | + } |
| 80 | + if (!eFind) { |
| 81 | + temp[1] = newEnd; |
| 82 | + } else { |
| 83 | + temp[1] = intervals[ei][1]; |
| 84 | + } |
| 85 | + if (!sFind && !eFind) { |
| 86 | + // 新插入一个 |
| 87 | + retArr = new int[intervals.length + 1][]; |
| 88 | + int insetI = 0; |
| 89 | + for (int i = 0; i < intervals.length; i++) { |
| 90 | + if (i == si) { |
| 91 | + retArr[insetI] = temp; |
| 92 | + insetI++; |
| 93 | + } |
| 94 | + retArr[insetI] = intervals[i]; |
| 95 | + insetI++; |
| 96 | + } |
| 97 | + } else { |
| 98 | + intervals[si] = temp; |
| 99 | + retArr = Arrays.copyOf(intervals, intervals.length); |
| 100 | + } |
| 101 | + } else { |
| 102 | + // 合并区间 |
| 103 | + int skipStartI, skipEndI; |
| 104 | + int[] temp = new int[2]; |
| 105 | + if (sFind) { |
| 106 | + temp[0] = intervals[si][0]; |
| 107 | + skipStartI = si; |
| 108 | + } else { |
| 109 | + temp[0] = newStart; |
| 110 | + skipStartI = si; |
| 111 | + } |
| 112 | + if (eFind) { |
| 113 | + temp[1] = intervals[ei][1]; |
| 114 | + skipEndI = ei; |
| 115 | + } else { |
| 116 | + temp[1] = newEnd; |
| 117 | + if (ei == -1) { |
| 118 | + skipEndI = intervals.length - 1; |
| 119 | + } else { |
| 120 | + skipEndI = ei - 1; |
| 121 | + } |
| 122 | + } |
| 123 | + int skip = skipEndI - skipStartI; |
| 124 | + retArr = new int[intervals.length - skip][]; |
| 125 | + for (int i = 0; i < intervals.length; i++) { |
| 126 | + if (i < skipStartI) { |
| 127 | + retArr[i] = intervals[i]; |
| 128 | + } else if (i >= skipStartI && i <= skipEndI) { |
| 129 | + if (i == skipStartI) { |
| 130 | + retArr[skipStartI] = temp; |
| 131 | + } |
| 132 | + } else { |
| 133 | + retArr[i - skip] = intervals[i]; |
| 134 | + } |
| 135 | + } |
| 136 | + } |
| 137 | + return retArr; |
| 138 | + } |
| 139 | + |
| 140 | +} |
0 commit comments