给出一个无重叠的按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
样例
插入区间[2, 5] 到 [[1,2], [5,9]],我们得到 [[1,9]]。
插入区间[3, 4] 到 [[1,2], [5,9]],我们得到 [[1,2], [3,4], [5,9]]。
解答
这道题主要考察的是细节处理的过程, 因为插入后的区间可能会出现三种可能。1, 在头插入,2,在中间插入,3,在尾插入。 第1,3好处理,直接判断是在头还是在尾,直接加入就好。 然后第2种需要判断插入后的区间是否可以和其他的区间合并。 所以要扫描一遍,判断他前后有没有可以合并的区间,然后把他们合并在一起。
/**
* Definition of Interval:
* class Interval {
* public:
* int start, end;
* Interval(int start, int end) {
* this->start = start;
* this->end = end;
* }
* }
*/
class Solution {
public:
/**
* Insert newInterval into intervals.
* @param intervals: Sorted interval list.
* @param newInterval: new interval.
* @return: A new interval list.
*/
vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {
// write your code here
int n = intervals.size();
int &k1=newInterval.start,&k2=newInterval.end;
vector<Interval> &ii=intervals;
// cout<<n<<endl;
int m ,i;
//排除第一三种情况
if(n==0){
intervals.push_back(newInterval);
return intervals;
}
if(k2<ii[0].start){
intervals.insert(intervals.begin(), newInterval);
return intervals;
}
if(k1>ii[n-1].end){
intervals.insert(intervals.end(), newInterval);
return intervals;
}
//找到中间的值
for(i=0;i<n;i++){
if(k1<=ii[i].end){
m=i;
break;
}
}
//对第二种情况进行讨论
if(k1<ii[m].start){
for(i=m;i<n;){
if(k2<ii[i].start){
intervals.insert(intervals.begin()+i, newInterval);
return intervals;
}
if(k2>=ii[i].start&&k2<=ii[i].end){
intervals[i].start = newInterval.start;
return intervals;
}
if(i+1==n){
intervals[i].start = newInterval.start;
intervals[i].end = newInterval.end;
return intervals;
}
if(k2>ii[i].end&&k2<ii[i+1].start){
intervals[i].start = newInterval.start;
intervals[i].end = newInterval.end;
return intervals;
}
else{
ii.erase(ii.begin()+i);
n--;
}
}
}
if(k1>=ii[m].start){
if(k2<=ii[i].end)
return intervals;
if(i+1==n){
intervals[i].end=newInterval.end;
return intervals;
}
if(k2>ii[i].end&&k2<ii[i+1].start){
intervals[i].end = newInterval.end;
return intervals;
}
else{
newInterval.start=intervals[i].start;
ii.erase(ii.begin()+i);
n--;
}
// cout<<newInterval.start<<n;
for(i=m;i<n;){
// cout<<m;
if(k2<=ii[i].end){
ii[i].start=k1;
return intervals;
}
if(i+1==n){
intervals[i].start = newInterval.start;
intervals[i].end = newInterval.end;
return intervals;
}
if(k2>ii[i].end&&k2<ii[i+1].start){
intervals[i].end = newInterval.end;
return intervals;
}
else{
newInterval.start=intervals[i].start;
ii.erase(ii.begin()+i);
n--;
}
}
}
return intervals;
}
};