Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).
You may assume that the intervals were initially sorted according to their start times.
Example 1:
Given intervals [1,3],[6,9]
, insert and merge [2,5]
in as [1,5],[6,9]
.
Example 2:
Given [1,2],[3,5],[6,7],[8,10],[12,16]
, insert and merge [4,9]
in as [1,2],[3,10],[12,16]
.
This is because the new interval [4,9]
overlaps with [3,5],[6,7],[8,10]
.
题意: 给定一组无重叠,且排序的区间,在其中插入一个区间,然后求合并之后的区间集合 。
此题可以参考上一题的解答过程,链接:点击打开链接
思路是,我们在区间集合中找到插入的区间的位置插入,保证插入之后的集合仍然有序,然后在使用上一题中的合并方法合并一次即可。
下面是代码:
public class Solution {
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
List<Interval> list = new ArrayList<>();
List<Interval> list1 = new ArrayList<>();
if(intervals.size() == 0){
list1.add(newInterval);
return list1;
}
if(newInterval == null)
return intervals;
boolean b = false;
for(Interval in : intervals){
if(newInterval.start<=in.start){
list.add(newInterval);
b = true;
}
list.add(in);
}
if(b == false)
list.add(newInterval);
Interval ks = list.get(0);
for(Interval inte : list){
if(inte.start <= ks.end)
ks = new Interval(ks.start,Math.max(inte.end,ks.end));
else{
list1.add(ks);
ks = inte;
}
}
list1.add(ks);
return list1;
}
}
第一次循环,将所有小于插入区间并且与插入区间无重叠的区间直接存入集合中。
第二次循环,处理与插入区间有交集的部分集合,定义一个新的区间存入集合
第三次循环,将所有大于插入区间并且与插入区间无交集的区间存入集合
具体实现过程参考下面的代码:
public class Solution { public List<Interval> insert(List<Interval> intervals, Interval newInterval) { List<Interval> list = new ArrayList<>(); if(intervals.size() == 0){ list.add(newInterval); return list; } if(newInterval == null) return intervals; int i = 0; while(i<intervals.size() && newInterval.start > intervals.get(i).end){ //第一次循环,将在newInterval前面的区间加入集合 list.add(intervals.get(i)); i++; } int newStart = i==intervals.size() ? newInterval.start : Math.min(newInterval.start,intervals.get(i).start);
while(i<intervals.size() && newInterval.end >= intervals.get(i).start){ //第二次循环//定义新区间的起始位置
i++;
}
int newEnd = i==0 ? newInterval.end : Math.max(newInterval.end,intervals.get(i-1).end);list.add(new Interval(newStart,newEnd));//定义新区间的末位置
while(i<intervals.size()) //第三次循环,将剩余区间加入集合
list.add(intervals.get(i++));
return list;
}
} 这是一种比较优化的方法,很不错。在LeetCode上超越了96.35的答案!