写太复杂了。

思想:确定带插入区间的每一个边界位于给定区间中的哪个位置,共同拥有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. [转]linux多命令的顺序执行

    当我们需要一次执行多个命令的时候,命令之间需要用连接符连接,不同的连接符有不同的效果. (1) ; 分号,没有任何逻辑关系的连接符.当多个命令用分号连接时,各命令之间的执行成功与否彼此没有任何影响,都 ...

  2. Python Excel导入数据库

    import xlrd import MySQLdb def inMySQL(file_name): wb = xlrd.open_workbook(file_name) sh = wb.sheet_ ...

  3. Welcome-to-Swift-06函数(Functions)

    函数是执行特定任务的代码自包含块.给定一个函数名称标识, 当执行其任务时就可以用这个标识来进行"调用". Swift的统一的功能语法足够灵活来表达任何东西,无论是甚至没有参数名称的 ...

  4. 基于 K8S 构建数据中心操作系统

    在 12 月 22 日 ECUG 的下午场 ,七牛云容器计算部技术总监袁晓沛为大家带来了主题为<基于 K8S 的 DCOS 之路>的精彩分享,向大家介绍了七牛容器云目前 K8S 的状况和产 ...

  5. 用jQuery实现搜索框的过滤效果

    遇到的问题: 1.动态添加了某些元素,在动态添加的某个元素上绑定事件失效 原因:因为需要绑定的元素的直接父元素也是动态添加的解决:向上为上一级父元素绑定事件 $(".check-box&qu ...

  6. HDU——4291A Short problem(矩阵快速幂+循环节)

    A Short problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  7. 配置vscode使它能够在自定义扩展名当中支持emment语法

    在.vue文件当中默认是不支持emment的,需要在vscode设置当中设置 "emmet.syntaxProfiles": { "vue-html": &qu ...

  8. C语言扩展题

    1.使用cmake来创建c语言工程 2.使用gcc来编译源代码 3.下载redis,并且编译运行redis(注:redis目前是c语言编写的,而且是主要是linux平台,在windows平台编译比较麻 ...

  9. hdu 5971 Wrestling Match 二分图染色

    题目链接 题意 \(n\)人进行\(m\)场比赛,给定\(m\)场比赛的双方编号:再给定已知的为\(good\ player\)的\(x\)个人的编号,已知的为\(bad\ player\)的\(y\ ...

  10. 公司内部技术分享之Vue.js和前端工程化

    今天主要的核心话题是Vue.js和前端工程化.我将结合我这两年多的工作学习经历来谈谈这个,主要侧重点是前端工程化,Vue.js侧重点相对前端工程化,比重不是特别大. Vue.js Vue.js和Rea ...