LintCode 30插入区间
问题
给出一个无重叠的按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。
样例
插入区间[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插入区间的更多相关文章
- lintcode:插入区间
题目: 插入区间 给出一个无重叠的按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 样例 插入区间[2, 5] 到 [ ...
- bzoj 3065: 带插入区间K小值 替罪羊树 && AC300
3065: 带插入区间K小值 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 1062 Solved: 253[Submit][Status] Des ...
- 【BZOJ3065】带插入区间K小值 替罪羊树+权值线段树
[BZOJ3065]带插入区间K小值 Description 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理 ...
- BZOJ 3065 带插入区间K小值(sag套线段树)
3065: 带插入区间K小值 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 4696 Solved: 1527[Submit][Status][Di ...
- 【BZOJ】3065: 带插入区间K小值
http://www.lydsy.com/JudgeOnline/problem.php?id=3065 题意:带插入.修改的区间k小值在线查询.(原序列n<=35000, 询问<=175 ...
- LeetCode 57 插入区间
题目: 给出一个无重叠的 ,按照区间起始端点排序的区间列表. 在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间). 示例 1: 输入: intervals ...
- 合并区间 · Merge Intervals & 插入区间 · Insert Interval
[抄题]: 给出若干闭合区间,合并所有重叠的部分. 给出的区间列表 => 合并后的区间列表: [ [ [1, 3], [1, 6], [2, 6], => [8, 10], [8, 10] ...
- [BZOJ3065]带插入区间K小值 解题报告 替罪羊树+值域线段树
刚了一天的题终于切掉了,数据结构题的代码真**难调,这是我做过的第一道树套树题,做完后感觉对树套树都有阴影了......下面写一下做题记录. Portal Gun:[BZOJ3065]带插入区间k小值 ...
- 【题解】BZOJ 3065: 带插入区间K小值——替罪羊树套线段树
题目传送门 题解 orz vfk的题解 3065: 带插入区间K小值 系列题解 一 二 三 四 惨 一开始用了一种空间常数很大的方法,每次重构的时候merge两颗线段树,然后无限RE(其实是MLE). ...
随机推荐
- python-re使用举例
代码: import re text = "JGood is a handsome boy, he is cool, clever, and so on..." print(tex ...
- 细说CSS中的display属性
相信大部分奋战在前端的,尤其在前端攻城的过程中,有一种越陷越深的感觉,不错,一如前端深似海,从此妹子是浮云啊,前端上手容易,深入难啊!下面我就CSS中的display属性讲下我自己所积累的,与大家共享 ...
- 6 手写Java LinkedHashMap 核心源码
概述 LinkedHashMap是Java中常用的数据结构之一,安卓中的LruCache缓存,底层使用的就是LinkedHashMap,LRU(Least Recently Used)算法,即最近最少 ...
- E20190214-mt
roughly adv. 粗略地; 大致上; 大体上; 粗暴地; equivalent adj. 相等的,相当的,等效的; 等价的,等积的; [化学] 当量的; consult vi. 咨询; 商 ...
- windows7任务管理器内存相关列详细解释
内存 - 工作集:私人工作集中的内存数量与进程正在使用且可以由其他进程共享的内存数量的总和. 内存 - 峰值工作集:进程所使用的工作集内存的最大数量. 内存 - 工作集增量:进程所使用的工作集内存 ...
- Unity Prefabs
通过上一期的学习,我们知道为了如何向场景中添加一个物体.问题来了,如果需要对这个立方体进行修改应该怎么做呢?那我们肯定就得修改这段代码,能不能将立方体本身从我们的开发中单独提出来呢?这就涉及到我们今天 ...
- 51nod1352(exgcd)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1352 题意:中文题诶- 思路:exgcd 显然题目可以描述为: ...
- CF364D Ghd(随机化)
另一个集合\(s\)的\(ghd\)为\(max\{gcd(s')||s'|>=0.5|s|\}\) 给定序列\(a\),求\(ghd\) 随机化算法.因为\(|s'|\geq 0.5|S|\) ...
- pgsql如何重启
正常情况下,pgsql 停止可以执行一下命令: bin/pg_ctl stop -s -D pg_data/ -m fast 此命令和 kill -15 PID 效果相同 但是有时候 pgsql 也会 ...
- [C++]关于头文件中的防卫式声明
大家知道,我们写.h文件时,通常会加上防卫式声明,有以下两种方式: 1. 宏定义 1 2 3 4 #ifndef _FILENAME_ #define _FILENAME_ //... #endif ...