写太复杂了。

思想:确定带插入区间的每一个边界位于给定区间中的哪个位置,共同拥有5种情况

-1 |(0)_1_(2)|  (3)

当中。0,1,2这三种情况是一样的。

确定每一个带插入区间的两个边界分别属于哪种情况,记为flag0和flag1。

然后依据flag0和flag1的组合情况,分9种情况进行讨论

class Solution {
public:
vector<Interval> insert(vector<Interval> &its, Interval ni) {
int i,n=its.size(),j,k;
int flag0=-1,flag1=-1;
vector<Interval>ans;
if(n==0){
ans.push_back(ni);
return ans;
}
for(i=0;i<n;++i)
if((i==0||its[i-1].end<ni.start)&&its[i].start>ni.end)
break;
if(i<n||(i==n&&its[n-1].end<ni.start)){
for(k=0;k<i;++k)ans.push_back(its[k]);
ans.push_back(ni);
for(;k<n;++k)ans.push_back(its[k]);
return ans;
}
for(i=0;i<n;++i){
if(its[i].end==ni.start){flag0=2;break;}
else if(its[i].start==ni.start){flag0=0;break;}
else if(its[i].start>ni.start)break;
else if(its[i].start<ni.start&&its[i].end>ni.start){flag0=1;break;}
}
if(i==n&&flag0==-1)flag0=3;//no exist
for(j=i;j<n;++j){
if(its[j].end==ni.end){flag1=2;break;}
else if(its[j].start==ni.end){flag1=0;break;}
else if(its[j].start>ni.end)break;
else if(its[j].start<ni.end&&its[j].end>ni.end){flag1=1;break;}
}
if(j==n&&flag1==-1)flag1=3;//可能存在
for(k=0;k<i;++k)ans.push_back(its[k]);
if(flag1==-1){
if(flag0==3){
ans.push_back(ni);
return ans;
}
else if(flag0>=0&&flag0<=2){
its[i].end=ni.end;
}
else if(flag0==-1){
its[i].end=ni.end;its[i].start=ni.start;
}
ans.push_back(its[i]);
for(k=j;k<n;++k)ans.push_back(its[k]);
}
else if(flag1>=0&&flag1<=2){
if(flag0==3){
its[j].start=ni.start;
}
else if(flag0>=0&&flag0<=2){
if(i!=j){
its[i].end=its[j].end;
ans.push_back(its[i]);
for(k=j+1;k<n;++k)ans.push_back(its[k]);
return ans;
}
}
else if(flag0==-1){
if(i==j){
its[j].start=ni.start;
}
else{
its[i].start=ni.start;
its[i].end=its[j].end;
ans.push_back(its[i]);
for(k=j+1;k<n;++k)ans.push_back(its[k]);
return ans;
}
}
for(k=i;k<n;++k)ans.push_back(its[k]);
}
else if(flag1==3){//j==n
if(flag0==3){
ans.push_back(Interval(-1117,-1117));//不存在
}
else if(flag0>=0&&flag0<=2){
its[i].end=ni.end;
ans.push_back(its[i]);
return ans;
}
else if(flag0==-1){
its[i].start=ni.start;
its[i].end=ni.end;
ans.push_back(its[i]);return ans;
}
for(k=i;k<n;++k)ans.push_back(its[k]);
}
return ans;
}
};

这题C++假设採用从原vector删除元素的方法,因为存在大量的移动。会导致超时。

法2:

class Solution {
public:
vector<Interval> insert(vector<Interval> &its, Interval ni) {
int i,n=its.size(),j,k;
if(n==0){
its.push_back(ni);
return its;
}
vector<Interval>ans;//分成三段
for(i=0;i<n&&its[i].end<ni.start;++i)ans.push_back(its[i]);
if(i<n){
ni.start=min(its[i].start,ni.start);
}
else{
ans.push_back(ni);
return ans;
}
for(;i<n&&ni.end>=its[i].start;++i){
ni.end=max(its[i].end,ni.end);
}
ans.push_back(ni);
for(;i<n;++i)ans.push_back(its[i]);
return ans;
}
};

[LeetCode]Insert Interval 考虑多种情况的更多相关文章

  1. leetcode Insert Interval 区间插入

    作者:jostree  转载请注明出处 http://www.cnblogs.com/jostree/p/4051169.html 题目链接:leetcode Insert Interval 使用模拟 ...

  2. [LeetCode] Insert Interval 插入区间

    Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...

  3. Leetcode Insert Interval

    Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...

  4. [leetcode]Insert Interval @ Python

    原题地址:https://oj.leetcode.com/problems/insert-interval/ 题意: Given a set of non-overlapping intervals, ...

  5. 57[LeetCode] Insert Interval

    Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...

  6. [LeetCode] Insert Interval 二分搜索

    Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...

  7. [LeetCode] Merge Interval系列,题:Insert Interval,Merge Intervals

    Interval的合并时比较常见的一类题目,网上的Amazon面经上也有面试这道题的记录.这里以LeetCode上的例题做练习. Merge Intervals Given a collection ...

  8. 【LeetCode】57. Insert Interval [Interval 系列]

    LeetCode中,有很多关于一组interval的问题.大体可分为两类: 1.查看是否有区间重叠: 2.合并重叠区间;  3.插入新的区间: 4. 基于interval的其他问题 [ 做题通用的关键 ...

  9. 【题解】【区间】【二分查找】【Leetcode】Insert Interval & Merge Intervals

    Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...

随机推荐

  1. ubuntu14.04修改mysql默认编码

    修改文件为/etc/mysql/my.cnf [client] default-character-set = utf8 (ps:client的设置没变) [mysqld] lower_case_ta ...

  2. 【Luogu】P2567幸运数字(容斥爆搜)

    题目链接 先预处理出幸运数,把成倍数关系的剔掉,然后用容斥原理搜索一下. 这里的容斥很像小学学的那个“班上有n个同学,有a个同学喜欢数学,b个同学喜欢语文……”那样. #include<cstd ...

  3. POJ——1308Is It A Tree?(模拟拓扑排序判断有向图是否为树)

    Is It A Tree? Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28399   Accepted: 9684 De ...

  4. NOJ——1274The battle of Red Cliff(并查集按秩合并)

    [1274] The battle of Red Cliff 时间限制: 1000 ms 内存限制: 65535 K 问题描述 Zero loves palying Sanguo game very ...

  5. NOJ——1627Alex’s Game(II)(尺取)

    [1627] Alex’s Game(II) 时间限制: 2000 ms 内存限制: 65535 K 问题描述 Alex likes to play with one and zero as you ...

  6. java面试题之死锁产生的条件,以及如何避免死锁,银行家算法,产生死锁后如何解决(阿里面试题)

    死锁产生的四个必要条件: 互斥:一个资源每次只能被一个进程使用(资源独立) 请求与保持:一个进程因请求资源而阻塞时,对已获得的资源保持不放(不释放锁) 不剥夺:进程已获得的资源,在未使用之前,不能强行 ...

  7. C# 图像旋转代码

    方法一: public static Bitmap rotateImage(Bitmap b, float angle) { //create a new empty bitmap to hold r ...

  8. 【BZOJ1579】Revamping Trails(分层图,最短路,堆)

    题意:每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i (1 <= ...

  9. 【BZOJ3524】Couriers(主席树)

    题意:给一个长度为n的序列a.1≤a[i]≤n.m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2.如果存在,输出这个数,否则输出0. n,m≤5000 ...

  10. 25深入理解C指针之---传递数组

    一.传递数组:将数组作为参数传入函数,或将数组作为数据当成是函数的返回值 1.定义:可以传入和传出数组 2.特征: 1).将数组作为参数传递给函数的本质是传递数组的地址,这种传递无需复制数组元素,所以 ...