刷 June-19-2019
主要思路是,merge all intervals that have overlap with being-inserted interval
Edge case比较麻烦。
- 有可能合并完没有剩下的了,要插入的变成了最后一个,没插入,所以最后要多插入一下
- 有可能合并完还有剩下的,剩下可以按部就班都插入进去,所以最后不需要多插入一下
解决这2个CASE的方法就是,第二种的情况下,插入,然后更新待插入的。。这样总会剩下一个。
public int[][] insert(int[][] intervals, int[] newInterval) {
if (intervals.length == 0) {
return new int[][]{newInterval};
}
List<int[]> tempList = new ArrayList<>();
for (int i = 0; i < intervals.length; i ++) {
int[] temp = intervals[i];
if (temp[1] < newInterval[0]) {
tempList.add(temp);
} else if (temp[0] > newInterval[1]) {
// from now on, there won't be any overlaps. 这样不停更新newInterval的好处是,最后会少加1个,因为
// 下面ELSE的有一个情况是,一直MERGE到最后,并没有加到tempList里,这样的好处是保持一直,总有最后一个newInterval没加
// 换一种想法其实就是,第一个if之后,当做merge interval重新做了一遍。。
tempList.add(newInterval);
newInterval = temp;
} else {
// start to encounter overlap, merge all overlaps, newInterval will eventually become merged result
newInterval[0] = Math.min(temp[0], newInterval[0]);
newInterval[1] = Math.max(temp[1], newInterval[1]);
}
}
int[][] res = new int[tempList.size() + 1][2];
for (int i = 0; i < tempList.size(); i++) {
res[i] = tempList.get(i);
}
res[tempList.size()] = newInterval;
return res;
}