[LeetCode]Insert Interval 考虑多种情况
写太复杂了。
思想:确定带插入区间的每一个边界位于给定区间中的哪个位置,共同拥有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 考虑多种情况的更多相关文章
- leetcode Insert Interval 区间插入
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4051169.html 题目链接:leetcode Insert Interval 使用模拟 ...
- [LeetCode] Insert Interval 插入区间
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...
- Leetcode Insert Interval
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...
- [leetcode]Insert Interval @ Python
原题地址:https://oj.leetcode.com/problems/insert-interval/ 题意: Given a set of non-overlapping intervals, ...
- 57[LeetCode] Insert Interval
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...
- [LeetCode] Insert Interval 二分搜索
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...
- [LeetCode] Merge Interval系列,题:Insert Interval,Merge Intervals
Interval的合并时比较常见的一类题目,网上的Amazon面经上也有面试这道题的记录.这里以LeetCode上的例题做练习. Merge Intervals Given a collection ...
- 【LeetCode】57. Insert Interval [Interval 系列]
LeetCode中,有很多关于一组interval的问题.大体可分为两类: 1.查看是否有区间重叠: 2.合并重叠区间; 3.插入新的区间: 4. 基于interval的其他问题 [ 做题通用的关键 ...
- 【题解】【区间】【二分查找】【Leetcode】Insert Interval & Merge Intervals
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...
随机推荐
- [转]linux多命令的顺序执行
当我们需要一次执行多个命令的时候,命令之间需要用连接符连接,不同的连接符有不同的效果. (1) ; 分号,没有任何逻辑关系的连接符.当多个命令用分号连接时,各命令之间的执行成功与否彼此没有任何影响,都 ...
- Python Excel导入数据库
import xlrd import MySQLdb def inMySQL(file_name): wb = xlrd.open_workbook(file_name) sh = wb.sheet_ ...
- Welcome-to-Swift-06函数(Functions)
函数是执行特定任务的代码自包含块.给定一个函数名称标识, 当执行其任务时就可以用这个标识来进行"调用". Swift的统一的功能语法足够灵活来表达任何东西,无论是甚至没有参数名称的 ...
- 基于 K8S 构建数据中心操作系统
在 12 月 22 日 ECUG 的下午场 ,七牛云容器计算部技术总监袁晓沛为大家带来了主题为<基于 K8S 的 DCOS 之路>的精彩分享,向大家介绍了七牛容器云目前 K8S 的状况和产 ...
- 用jQuery实现搜索框的过滤效果
遇到的问题: 1.动态添加了某些元素,在动态添加的某个元素上绑定事件失效 原因:因为需要绑定的元素的直接父元素也是动态添加的解决:向上为上一级父元素绑定事件 $(".check-box&qu ...
- HDU——4291A Short problem(矩阵快速幂+循环节)
A Short problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- 配置vscode使它能够在自定义扩展名当中支持emment语法
在.vue文件当中默认是不支持emment的,需要在vscode设置当中设置 "emmet.syntaxProfiles": { "vue-html": &qu ...
- C语言扩展题
1.使用cmake来创建c语言工程 2.使用gcc来编译源代码 3.下载redis,并且编译运行redis(注:redis目前是c语言编写的,而且是主要是linux平台,在windows平台编译比较麻 ...
- hdu 5971 Wrestling Match 二分图染色
题目链接 题意 \(n\)人进行\(m\)场比赛,给定\(m\)场比赛的双方编号:再给定已知的为\(good\ player\)的\(x\)个人的编号,已知的为\(bad\ player\)的\(y\ ...
- 公司内部技术分享之Vue.js和前端工程化
今天主要的核心话题是Vue.js和前端工程化.我将结合我这两年多的工作学习经历来谈谈这个,主要侧重点是前端工程化,Vue.js侧重点相对前端工程化,比重不是特别大. Vue.js Vue.js和Rea ...