题目:
分析:在非重叠的区间中插入一个新的区间,可能还需要与原有的区间进行合并,因此要对给定的区间集合进行遍历,需要考虑两点:
- 新插入的区间与原有区间不重叠,不重叠的情况分为两种:第一种是新区间的start>原区间的end;第二种是新区间的end<原区间的start。这种情况直接将新区间插入到对应的位置即可。
- 新插入的区间与原有区间重叠,可能存在多个重叠,所以需要更新区间的范围来包含所有重叠。
用变量cur来遍历区间,如果当前cur区间的结束位置小于新加入区间的开始位置,则说明没有重叠且新区间在当前cur区间后面,则将cur区间加入到res中,cur+1;如果当前cur区间的开始位置大于新加入区间的结束位置,则说明没有重叠且新区间在当前cur区间之前;除此之外的情况,都是有重叠的情况,此时更新新加入区间的开始位置和结束位置,更新后的开始位置为新区间开始位置和当前区间开始位置的较小的,更新后的结束位置为新区间结束位置和当前区间结束位置的较大的。
最后返回的cur为新区间插入的位置,在该位置插入新区间后返回即可。
/**
* Definition of Interval:
* public classs Interval {
* int start, end;
* Interval(int start, int end) {
* this.start = start;
* this.end = end;
* }
* }
*/
public class Solution {
/**
* @param intervals: Sorted interval list.
* @param newInterval: new interval.
* @return: A new interval list.
*/
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
// write your code here
List<Interval> res=new LinkedList<>();
int cur=0; //保存插入的位置
for(int i=0;i<intervals.size();i++){
Interval interval=intervals.get(i);
if(newInterval.end<interval.start){
res.add(interval);
}else if(newInterval.start>interval.end){
res.add(interval);
cur++;
}else{ //有重叠区域的情况
newInterval.start=Math.min(interval.start,newInterval.start);
newInterval.end=Math.max(interval.end,newInterval.end);
}
}
//在cur保存插入的位置
res.add(cur,newInterval);
return res;
}
}