博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Insert Interval
阅读量:5989 次
发布时间:2019-06-20

本文共 1911 字,大约阅读时间需要 6 分钟。

题解


题目描述

Insert Interval

即向有序、不重叠的区间序列中插入一个区间。如区间产生重叠,则合并。求插入新区间后的区间序列。
如:A = [1,3],[6,9],插入[2,6],插入后新序列为[1,9]

题解

由于序列有序,利用二分查找可在O(log N)时间内找到待插入区间的位置区间,而后合并区间即删除插入后产生的的重叠区间,由于是在数组上进行删除操作,时间复杂度为O(N)。即总体时间复杂度为O(N),空间复杂度为O(1)

代码

typedef std::vector
ParamType;bool cmpStart(const Interval& a, const Interval& b) { return a.start > b.start;}bool cmpEnd(const Interval& a, const Interval& b) { return a.end < b.end;}class Solution {public: vector
& insert(vector
& intervals, Interval newInterval) { ParamType::reverse_iterator start(std::lower_bound(intervals.rbegin(), intervals.rend(), newInterval, cmpStart)); ParamType::iterator end(std::upper_bound(intervals.begin(), intervals.end(), newInterval, cmpEnd)); if (start != intervals.rend() && newInterval.start <= start->end) { if (end != intervals.end() && newInterval.end >= end->start) { start->end = end->end; intervals.erase(intervals.begin() + (intervals.size() - (start - intervals.rbegin())), end + 1); } else { start->end = newInterval.end; intervals.erase(intervals.begin() + (intervals.size() - (start - intervals.rbegin())), end); } } else { if (end != intervals.end() && newInterval.end >= end->start) { end->start = newInterval.start; intervals.erase(intervals.begin() + (intervals.size() - (start - intervals.rbegin())), end); } else { ParamType::iterator in = intervals.begin() + (intervals.size() - (start - intervals.rbegin())); if (in != end) { *in = newInterval; intervals.erase(in + 1, end); } else { intervals.insert(in, newInterval); } } } return intervals; }};

总结

主要应用了二分查找的思想。

转载地址:http://nvnlx.baihongyu.com/

你可能感兴趣的文章
MYSQL乱码问题
查看>>
二叉堆
查看>>
SVN服务器搭建和使用(一)
查看>>
I.MX6 wpa_supplicant_8 编译问题
查看>>
设计模式之观察者模式
查看>>
【jQuery】:not选择器的说明和:checked选择器的使用
查看>>
web appbuilder 改变样式和添加自定义widget
查看>>
学生信息管理小系统(以XML为存储方式)
查看>>
[Android]使用自定义JUnit Rules、annotations和Resources进行单元测试(翻译)
查看>>
Android Studio重构之路,我们重新来了解一下Google官方的Android开发工具
查看>>
委托批量处理Excel
查看>>
JAVA进阶之旅(一)——增强for循环,基本数据类型的自动拆箱与装箱,享元设计模式,枚举的概述,枚举的应用,枚举的构造方法,枚举的抽象方法...
查看>>
Java后端WebSocket的Tomcat实现
查看>>
Android开发艺术探索——第二章:IPC机制(中)
查看>>
onWindowFocusChanged
查看>>
【spring源码学习】Spring的IOC容器之BeanPostProcessor接口学习
查看>>
[高中作文赏析]妈妈, 我心中的"灯"
查看>>
VMvare虚拟机如何删除安装的ubuntu操作系统
查看>>
mysql远程连接
查看>>
delphi XE7 数组操作中缺少的find(POS)功能
查看>>