[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下java命令行引用jar包
一般情况下: 如果java 文件和jar 包在同一目录 poi-3.0-alpha3-20061212.jar testTwo.java 编译: javac -cp poi-3.0-alpha3-2 ...
- iOS学习笔记32-iCloud入门
一.iCloud云服务 iCloud是苹果提供的云端服务,用户可以将通讯录.备忘录.邮件.照片.音乐.视频等备份到云服务器并在各个苹果设备间直接进行共享而无需关心数据同步问题,甚至即使你的设备丢失后在 ...
- 用jQuery实现搜索框的过滤效果
遇到的问题: 1.动态添加了某些元素,在动态添加的某个元素上绑定事件失效 原因:因为需要绑定的元素的直接父元素也是动态添加的解决:向上为上一级父元素绑定事件 $(".check-box&qu ...
- [NOIP2009] $Hankson$ 的趣味题 (数论,gcd)
题目链接 Solution 此题,用到的结论都是比较浅显的,但是,我竟然没想到反过来枚举... 只有50分... 被自己蠢哭... 结论比较浅显: 1.对于两个正整数\(a\),\(b\),设 \(g ...
- Python基础教程总结(二)
上周总结了一下Python的一些基本数据类型和用法.这次总结一下4-9章的内容,完后,赶紧学以致用吧. 5. 第四章——字典:当索引不好用时 字典是Python中唯一内建的映射类型.字典中的值并没有特 ...
- d3 比例尺
.domain([, ]) 定义域范围 .range([, ]) 值域范围 var scale = d3.scale.linear() .domain([, ]) .range([, ]); 将100 ...
- 在vue项目当中使用sass
需要分别安装node-sass 和 sass-loader;可以不需要ruby; webpack当中配置 { test: /\.vue$/, loader: 'vue-loader', options ...
- JS当中利用&&和||简化代码
; ){ add_level = ; } ){ add_level = ; } ){ add_level = ; } ){ add_level = ; } else { add_level = ; } ...
- ckeditor小记
widget 只要创建都会执行 init函数,可以绑定事件,但是如果widget释放了,其上绑定的时间也就没有了
- h5页面判断微信端用浏览器打开代码
<div class="weixin-tip"> <p> <img src="img/live_weixin.png" alt=& ...