思路: 和56题一模一样,其实就多了一步把新数组插入到矩阵中。我觉得lc上把这个思路总结还挺好的。我直接copy一下了。
下面展示代码:
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
if(intervals.length == 0){
int[][] res = new int[1][];
res[0] = newInterval;
return res;
}
LinkedList<int[]> list = new LinkedList<>();
int flag = 0;
if(newInterval[0] < intervals[0][0]){
flag =1;
list.add(newInterval);
}
for(int i = 0; i < intervals.length; i++){
if(flag == 0){
if(i == intervals.length - 1 && (newInterval[0] == intervals[i][0] || newInterval[0] > intervals[i][0])){
list.add(intervals[i]);
list.add(newInterval);
break;
}
if(newInterval[0] == intervals[i][0] || (newInterval[0] > intervals[i][0] && newInterval[0] < intervals[i + 1][0])){
flag = 1;
list.add(intervals[i]);
list.add(newInterval);
continue;
}
}
list.add(intervals[i]);
}
int[][] addedIntervals = list.toArray(new int[list.size()][]);
list.clear();
for(int[] interval : addedIntervals){
if(list.isEmpty() || list.getLast()[1] < interval[0]){
list.add(interval);
}else{
list.getLast()[1] = Math.max(list.getLast()[1],interval[1]);
}
}
return list.toArray(new int[list.size()][]);
}
}
下面再展示下标答,思路一模一样,但是比我写的好很多,而且他是one pass的。
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
// init data
int newStart = newInterval[0], newEnd = newInterval[1];
int idx = 0, n = intervals.length;
LinkedList<int[]> output = new LinkedList<int[]>();
// add all intervals starting before newInterval
while (idx < n && newStart > intervals[idx][0])
output.add(intervals[idx++]);
// add newInterval
int[] interval = new int[2];
// if there is no overlap, just add the interval
if (output.isEmpty() || output.getLast()[1] < newStart)
output.add(newInterval);
// if there is an overlap, merge with the last interval
else {
interval = output.removeLast();
interval[1] = Math.max(interval[1], newEnd);
output.add(interval);
}
// add next intervals, merge with newInterval if needed
while (idx < n) {
interval = intervals[idx++];
int start = interval[0], end = interval[1];
// if there is no overlap, just add an interval
if (output.getLast()[1] < start) output.add(interval);
// if there is an overlap, merge with the last interval
else {
interval = output.removeLast();
interval[1] = Math.max(interval[1], end);
output.add(interval);
}
}
return output.toArray(new int[output.size()][2]);
}
}