插入区间
题目描述
给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
示例 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] 重叠。
解决思路
一道hard的题,乍一看是排序,但由于只涉及插入操作,排序效率较低。
最后采用复杂的条件判断进行插入较快。
源码
/**
* Definition for an interval.
* public class Interval {
* int start;
* int end;
* Interval() { start = 0; end = 0; }
* Interval(int s, int e) { start = s; end = e; }
* }
*/
class Solution {
public List<Interval> insert(List<Interval> intervals, Interval newInterval) {
boolean flag=true;
int count=0;
int length=intervals.size();
Interval temp;
List<Interval> res=new ArrayList<>();
while(count<length){
temp=intervals.get(count);
if(flag){
if(newInterval.start>temp.end){
count++;
}else{
int s,e;
if(newInterval.start<temp.start){
s=newInterval.start;
}else{
s=temp.start;
}
if(newInterval.end<temp.end){
if(newInterval.end<temp.start){
e=newInterval.end;
}else{
e=temp.end;
count++;
}
}else{
e=newInterval.end;
count++;
while(count<length){
temp=intervals.get(count);
if(newInterval.end>temp.end){
count++;
}else{
if(newInterval.end>=temp.start){
e=temp.end;
count++;
}else{
e=newInterval.end;
}
break;
}
}
}
temp=new Interval(s,e);
flag=false;
}
}else{
count++;
}
res.add(temp);
}
if(flag){
res.add(newInterval);
}
return res;
}
}