题目
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary).
You may assume that the intervals were initially sorted according to their start times.
Example 1:
Given intervals [1,3],[6,9]
, insert and merge [2,5]
in as [1,5],[6,9]
.
Example 2:
Given [1,2],[3,5],[6,7],[8,10],[12,16]
, insert and merge [4,9]
in as [1,2],[3,10],[12,16]
.
This is because the new interval [4,9]
overlaps with [3,5],[6,7],[8,10]
.
将区间插入已经排序好的区间。
从头开始向后扫描:
1、如果不重叠,且排序好的区间小于要插入的区间,将原区间插入结果;
2、如果重叠,合并,作为新的要插入的区间;
3、如果不重叠,且排序好的区间大于要插入的区间,在结果中插入要插入的区间,后面所有的区间;
二分查找的思路:
如果数据量较大,原数据可以较快地修改,删除,插入。
可以使用二分查找,分别找出要插入的头在原区间头的位置,要插入的尾在原区间尾的位置。
比较前后两个位置各自前后的两个区间,可以确定合并情况。
然后将要合并的区间合并即可得到结果。
代码:线性查找
/**
* Definition for an interval.
* struct Interval {
* int start;
* int end;
* Interval() : start(0), end(0) {}
* Interval(int s, int e) : start(s), end(e) {}
* };
*/
class Solution {
public:
vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {
vector<Interval> ans;
int len=intervals.size(),i;
for(i=0;i<len;i++) //扫描
{
if(newInterval.start>intervals[i].end) //不重叠,且大于目前区间,压入目前区间
ans.push_back(intervals[i]);
else if(newInterval.end>=intervals[i].start) //重叠,合并
{
newInterval.start=min(newInterval.start,intervals[i].start);
newInterval.end=max(newInterval.end,intervals[i].end);
}
else //不重叠,小于当前区间,压入插入区间和后面的区间
{
ans.push_back(newInterval);
while(i<len)
{
ans.push_back(intervals[i]);
i++;
}
}
}
if(i==len) //没有压入新区间则压入
ans.push_back(newInterval);
return ans;
}
};