问题

给出一个无重叠的按照区间起始端点排序的区间列表。

在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

样例

插入区间[2, 5] 到 [[1,2], [5,9]],我们得到 [[1,9]]

插入区间[3, 4] 到 [[1,2], [5,9]],我们得到 [[1,2], [3,4], [5,9]]

思路

只要依次遍历,判断当前元素与要插入元素的关系。

如当前元素的右端点小于插入元素的左端点,则说明当前元素与插入元素无交并。

如当前元素的左端点大于插入元素的右端点,也说明当前元素与插入元素无交并。

依次遍历,判断当前元素与要插入元素的关系,若newInterval.end<it->start,则找到了插入点,插入这个新区间

若是相交的,那么就停止比较,把要插入元素和当前元素合并成新区间

因为合并后的新区间也许和右边的元素有交集,会引起连锁反应,所以一直和右边的元素合并,直到无法合并为止

使用链表做存储结构,插入删除十分快捷,要不是lintcode 一定要求用vector存储,使用list,会很省空间,都在原地插入合并

代码

#include<iostream>

#include<vector>

#include<list>

#include <fstream>

using namespace std;

//LintCode 30

//只要依次遍历,判断当前元素与要插入元素的关系。

//如当前元素的右端点小于插入元素的左端点,则说明当前元素与插入元素无交并。

//如当前元素的左端点大于插入元素的右端点,也说明当前元素与插入元素无交并。

//依次遍历,判断当前元素与要插入元素的关系,若newInterval.end<it->start,则找到了插入点,插入这个新区间

//若是相交的,那么就停止比较,把要插入元素和当前元素合并成新区间

//因为合并后的新区间也许和右边的元素有交集,会引起连锁反应,所以一直和右边的元素合并,直到无法合并为止

//使用链表做存储结构,插入删除十分快捷,要不是lintcode 一定要求用vector存储,使用list,会很省空间,都在原地插入合并

//最开始我在想怎么能一次性合并上,不仅要考虑和左边区间的合并还要考虑和右边区间的合并,按照新的做法,我

//只要考虑和右边区间的合并即可

class Interval

{

public:

int start, end;

Interval(int start, int end)

{

this->start = start;

this->end = end;

}

};

vector<Interval> insert(vector<Interval> &intervals, Interval newInterval)

{

// write your code here

list<Interval> myList(intervals.begin(), intervals.end());

list<Interval>::iterator it;

for (it=myList.begin(); it!=myList.end(); it++)

{

if(newInterval.end<it->start)

//找到了插入点,插入点左边的区间是不可能和newInterval合并的,

//因为插入点左边的区间先扫描,要是可以合并的话就跳出了这个循环

{

myList.insert(it,newInterval);

vector<Interval> answer(myList.begin(),myList.end());

return answer;

}

if(!(newInterval.start>it->end||newInterval.end<it->start))//找到了可以合并的区间

break;

}

if(it==myList.end())//如果都不可以合并,而且插入点是最后一个区间之后

{

myList.push_back(newInterval);

vector<Interval> answer(myList.begin(),myList.end());

return answer;

}

//在it处与newInterval合并

int start=(it->start<newInterval.start)?it->start:newInterval.start;

int end=(it->end>newInterval.end)?it->end:newInterval.end;

it->start=start;

it->end=end;

list<Interval>::iterator it2=++it;//迭代器只能++,--不能-1只好出此下策

it--;

//连锁反应不停地合并,直到不能合并为止,it2是it的下一个位置,如果已经到了end无需合并

while(it2!=myList.end())

{

if(it->end<it2->start)//一旦无法继续合并,就跳出循环

break;

else//it需要与it+1合并

{

int end=(it->end>it2->end)?it->end:it2->end;

it->end=end;

it2=myList.erase(it2);//删除被合并的元素

}

}

vector<Interval> answer(myList.begin(),myList.end());

return answer;

}

int main()

{

ifstream in("LintCode30.txt");

Interval newInterval(24,33);

int num=0;

int startp=0;

int endp=0;

in>>num;

vector<Interval> intervals;

for(int i=0; i<num; i++)

{

in>>startp>>endp;

Interval tmp(startp,endp);

intervals.push_back(tmp);

}

vector<Interval> answer=insert(intervals,newInterval);

vector<Interval>::iterator it2;

for (it2=answer.begin(); it2!=answer.end(); ++it2)

cout<<it2->start<<" "<<it2->end<<endl;

}

LintCode 30插入区间的更多相关文章

  1. lintcode:插入区间

    题目: 插入区间 给出一个无重叠的按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 样例 插入区间[2, 5] 到 [ ...

  2. bzoj 3065: 带插入区间K小值 替罪羊树 && AC300

    3065: 带插入区间K小值 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 1062  Solved: 253[Submit][Status] Des ...

  3. 【BZOJ3065】带插入区间K小值 替罪羊树+权值线段树

    [BZOJ3065]带插入区间K小值 Description 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理 ...

  4. BZOJ 3065 带插入区间K小值(sag套线段树)

    3065: 带插入区间K小值 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 4696  Solved: 1527[Submit][Status][Di ...

  5. 【BZOJ】3065: 带插入区间K小值

    http://www.lydsy.com/JudgeOnline/problem.php?id=3065 题意:带插入.修改的区间k小值在线查询.(原序列n<=35000, 询问<=175 ...

  6. LeetCode 57 插入区间

    题目: 给出一个无重叠的 ,按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 示例 1: 输入: intervals ...

  7. 合并区间 · Merge Intervals & 插入区间 · Insert Interval

    [抄题]: 给出若干闭合区间,合并所有重叠的部分. 给出的区间列表 => 合并后的区间列表: [ [ [1, 3], [1, 6], [2, 6], => [8, 10], [8, 10] ...

  8. [BZOJ3065]带插入区间K小值 解题报告 替罪羊树+值域线段树

    刚了一天的题终于切掉了,数据结构题的代码真**难调,这是我做过的第一道树套树题,做完后感觉对树套树都有阴影了......下面写一下做题记录. Portal Gun:[BZOJ3065]带插入区间k小值 ...

  9. 【题解】BZOJ 3065: 带插入区间K小值——替罪羊树套线段树

    题目传送门 题解 orz vfk的题解 3065: 带插入区间K小值 系列题解 一 二 三 四 惨 一开始用了一种空间常数很大的方法,每次重构的时候merge两颗线段树,然后无限RE(其实是MLE). ...

随机推荐

  1. mysql:视图,触发器

    一视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL 语句获取动态的数据集,并未其命名],用户使用时只需使用名称即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以吧查询过程的临时表 ...

  2. 梦工厂实验室 取石子之fans 博弈

    问题 D: 取石子之fans 时间限制: 1 Sec  内存限制: 64 MB提交: 57  解决: 26[提交][状态][讨论版] 题目描述 Yougth和Hrdv玩一个游戏,拿出n个石子摆成一圈, ...

  3. HDOJ1874最短路【spfa】

    //不知道切过这道题目几次了,这次又wa了...双向路啊....这波简直无奈了,今晚又是浪成狗!!!! #include<cstdio> #include<vector> #i ...

  4. 换装demo时美术遇到的问题详解

    1.武器替换:MAX的东西进Unity,根骨骼X轴会有270度的旋转. 解决方法:由程序强制武器进入Unity后的旋转角度. 2.蒙皮问题:face和hair等脖子以上部位蒙皮的时候,导入Unity后 ...

  5. [Xcode 实际操作]二、视图与手势-(3)UIView视图的基本操作

    目录:[Swift]Xcode实际操作 本文将实现视图的添加与删除,以及切换视图在父视图中的层次. import UIKit class ViewController: UIViewControlle ...

  6. [Xcode 实际操作]九、实用进阶-(28)在iTunes Connect(苹果商店的管理后台)中创建一个新的新的APP

    目录:[Swift]Xcode实际操作 本文将演示如何在iTunes Connect(苹果商店的管理后台)中创建一个新的新的APP. 首先要做的是打开浏览器,并进入[iTunesConnect网站], ...

  7. ES6高级使用技巧(reduce,filter篇)

    本周总结 这几天在写Echarts自定义需求的时候发现了,图形化算法和函数式编程的应用场景,很多时候我们现在学的东西并一定在当前的这种状态有用,但是兴趣吧,喜欢就去学呗,没准在日后的工作日常中用到了 ...

  8. MySQL索引的学习

    MySQL索引的学习 关于使用mysql索引的好处,合理的设计并使用mysql索引能够有效地提高查询效率.对于没有索引的表,单表查询可能几十万数据就是平静,在大型网站单日可能会产生几十万甚至几百万的数 ...

  9. C 语言实例 - 字符转 ASCII 码

    C 语言实例 - 字符转 ASCII 码 C 语言实例 C 语言实例 ASCII 定义了 个字符. 分类: 一:-.(删除键)是控制字符 二:空白字符:空格(). 制表符. 垂直制表符. 换行. 回车 ...

  10. 「开源」SpringCloud+vue搭建的商城项目

    最近在研究SpringCloud,看到一个基于SpringCloud+vue搭建的模拟商城项目.用来辅助学习SpringCloud企业级开发还是很有帮助的.强烈推荐!! 源码地址在最后. spring ...