Merge interval
Given a collection of intervals, merge all overlapping intervals.
For example,
Given [1,3],[2,6],[8,10],[15,18]
,
return [1,6],[8,10],[15,18]
.
https://oj.leetcode.com/problems/insert-interval/
Insert interval
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]
.
https://oj.leetcode.com/problems/merge-intervals/
Merge interval
题目:求区间的并集问题,(1,2) (2,3) (5,6) (5,8) 合并后结果为 (1,3) (5,8)。
分析:
- 排序,以区间左边的数字关键字排序
- 用两个变量left,right分别记录能够合并的区间最左边和最右边的值。如果下一个区间starti<=right,表明两者可以合并,而合并后的right=max(endi, right)。 如果不满足条件,说明无法与该区间合并,则用new Interval(left,right)添加到结果集合中,同时left=starti,right=endi。
- 最后i>=len,退出的时候,要把最后一次push_back(Interval(left,right))。
bool mycompare(Interval a,Interval b){
return a.start<b.start;
}
class Solution {
public:
vector<Interval> merge(vector<Interval> &intervals) {
int len=intervals.size();
if(len<=1) return intervals;
vector<Interval> res;
//排序
sort(intervals.begin(),intervals.end(),mycompare);
int left=intervals[0].start,right=intervals[0].end;
for(int i=1;i<len;i++){
if(intervals[i].start <= right){
right=max(right,intervals[i].end); //!!取两者较大的值作为right
//continue;
}else{
res.push_back(Interval(left,right));
left=intervals[i].start;
right=intervals[i].end;
}
}
//添加最后一个
res.push_back(Interval(left,right));
return res;
}
};
Insert interval
题目:在一个组有序且无交叉的区间中,插入区间,返回合并后的区间。
分析:
- 找到区间该插入的位置,首次 i.end>=new.start的位置。将i之前的所有区间push到结果集合中。
- 同merge的方法,取new.start=min(new.start,i.start),取两者较小的值作为start值,然后向后查找,直到 new.end<x.start, 然后取较大的end作为new.end, 将new加入到结果集合中。
- 对于剩余的区间,添加到结果集合。
<pre name="code" class="cpp">class Solution {
public:
vector<Interval> insert(vector<Interval> &intervals, Interval newInterval) {
int len=intervals.size();
vector<Interval> res;
if(len<1){
res.push_back(newInterval);
return res;
}
int i=0;
//添加前半部分不需要合并的
while(i<len && (intervals[i].end < newInterval.start)){
res.push_back(intervals[i]);
i++;
}
//合并部分的左值
if(i<len){
newInterval.start=min(intervals[i].start,newInterval.start);
}
//合并部分的右值
while(i<len && intervals[i].start <= newInterval.end){
newInterval.end=max(intervals[i].end,newInterval.end);
i++;
}
res.push_back(newInterval);//合并部分的结果
while(i<len){ //插入剩余部分
res.push_back(intervals[i]);
i++;
}
return res;
}
};
insert interval 问题,在找合并位置时,可以使用二分查找(因为start值是排好序的),可以不申请额外的空间,直接修改输入的区间数组。编程之美上有类似的题目。