难度困难134收藏分享切换为英文关注反馈
给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例 1:
输入: intervals = [[1,3],[6,9]], newInterval = [2,5] 输出: [[1,5],[6,9]]
示例 2:
输入: intervals =[[1,2],[3,5],[6,7],[8,10],[12,16]]
, newInterval =[4,8]
输出: [[1,2],[3,10],[12,16]] 解释: 这是因为新的区间[4,8]
与[3,5],[6,7],[8,10]
重叠。
解法:模拟加贪心
插入区间要么和原先的区间融合要么不容和。所以先把比插入区间小的区间给输出去,然后再输出去的时候判断能不能和插入区间融合,不行就算了。行的话就融合,再加到list里面去。为什么要加 if(intervals[i][0]<newInterval[0])这个判断呢。如果不这样判断再去融合的话,要是融合完之后左区间比前一个左区间更小怎么办。办法肯定是有的。
class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
//int[][] intss=new int[intervals.length+1][intervals.length+1];
List<int[]> list =new ArrayList<>();
if(intervals.length==0){
list.add(newInterval);
return list.toArray(new int[0][]);
}
int flag=0;
int t=0;
for(int i=0;i<intervals.length;i++){
if(intervals[i][0]<newInterval[0]) {
if(t==0) {
if ((newInterval[0]<=intervals[i][1])){
intervals[i][1] = Math.max(intervals[i][1], newInterval[1]);
t=1;
}
}
if (list.size() == 0) {
list.add(intervals[i]);
} else if (list.get(list.size() - 1)[1] >= intervals[i][0]) {
list.get(list.size() - 1)[1] = Math.max(list.get(list.size() - 1)[1], intervals[i][1]);
} else
list.add(intervals[i]);
}
else {
if(t==0) {
if (newInterval[1] >= intervals[i][0]) {
intervals[i][0] = Math.min(intervals[i][0], newInterval[0]);
intervals[i][1] = Math.max(intervals[i][1], newInterval[1]);
t=1;
} else {
if (flag == 0) {
list.add(newInterval);
flag = 1;
}
}
}
if (list.size() == 0) {
list.add(intervals[i]);
} else if (list.get(list.size() - 1)[1] >= intervals[i][0]) {
list.get(list.size() - 1)[1] = Math.max(list.get(list.size() - 1)[1], intervals[i][1]);
} else
list.add(intervals[i]);
}
}
if(flag==0&&t==0){
list.add(newInterval);
}
// for(int i=0;i<list.size();i++){
// System.out.println(list.get(i)[0]+" "+list.get(i)[1]);
// }
return list.toArray(new int[0][]);
}
}