插入区间

来源:互联网 发布:淘宝没有销量 编辑:程序博客网 时间:2024/06/05 05:34

给出一个无重叠的按照区间起始端点排序的区间列表。

在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

样例

插入区间[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;
}
};

0 0