[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 ...
随机推荐
- -bash: ./start.sh: /bin/sh^M: bad interpreter: No such file or directory 错误解决方案
问题描述:sh文件中,在win环境下,用WinSCP编辑,出现如下错误: -bash: ./start.sh: /bin/sh^M: bad interpreter: No such file or ...
- 将Linux下python默认版本切换成替代版本
本文链接自http://www.myhack58.com/Article/48/66/2016/71806.htm 当你安装 Debian Linux 时,安装过程有可能同时为你提供多个可用的 Pyt ...
- OpenMP 并行编程
OpenMP 并行编程 最近开始学习并行编程,目的是为了提高图像处理的运行速度,用的是VS2012自带的OpenMP. 如何让自己的编译器支持OpenMP: 1) 点击 项目属性页 2)点击 配置 3 ...
- element-ui 的input组件 @keyup.enter事件的添加办法
<el-input placeholder="请输入密码" type="password" @keyup.enter.native="login ...
- 关于vue-router路径配置的问题
"/" 表示路由根目录 "/AdminPage" 表示一级路由 如果在一级路由下面配置子路由 "User",表示的意思是 "/Ad ...
- APUE 学习笔记(九) 高级I/O
1. 非阻塞I/O 低速系统调用时可能会使进程永远阻塞的一类系统调用,包括以下调用: (1)某些文件类型你(网络socket套接字.终端设备.管道)暂无可使用数据,则读操作可能会使调用者永远阻塞 (2 ...
- 51深入理解C指针之---指针与线程
一.size_t:用于安全表示长度,所有平台和系统都会解析成自己对应的长度 1.定义:size_t类型表示C中任何对象所能表示的最大长度,是个无符号整数:常常定义在stdio.h或stdlib.h中 ...
- QQ客服代码,支持临时会话
<a target="_blank" href="http://wpa.qq.com/msgrd?v=3&uin=QQ号&site=qq&m ...
- HYSBZ 1026: windy数(数位DP)
类型:数位DP题意:不含前导零且相邻两个数字之差至少为2的正整数被称为windy数.问[A,B]之间windy数的个数.(1 <= A <= B <= 2000000000 ) 思路 ...
- hdu 5459(递推好题)
Jesus Is Here Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 65535/102400 K (Java/Others)To ...