Merge/Insert interval 区间合并
2014-08-15 15:01
239 查看
Merge interval
Given a collection of intervals, merge all overlapping intervals.
For example,
Given
return
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
as
Example 2:
Given
as
This is because the new interval
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))。
代码:
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加入到结果集合中。
对于剩余的区间,添加到结果集合。
代码:
insert interval 问题,在找合并位置时,可以使用二分查找(因为start值是排好序的),可以不申请额外的空间,直接修改输入的区间数组。编程之美上有类似的题目。
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); } //合并部分的右值 4000 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值是排好序的),可以不申请额外的空间,直接修改输入的区间数组。编程之美上有类似的题目。
相关文章推荐
- Insert Interval 插入区间@LeetCode
- Insert Interval 插入区间到多个区间
- 【题解】【区间】【二分查找】【Leetcode】Insert Interval & Merge Intervals
- lintcode 容易题:Insert Interval 插入区间
- Insert Interval 插入区间
- 间隔问题,合并间隔(merge interval),插入间隔(insert interval)
- 【LeetCode-面试算法经典-Java实现】【057-Insert Interval(插入区间)】
- insert-interval 插入区间
- 【LeetCode-面试算法经典-Java实现】【057-Insert Interval(插入区间)】
- Insert Interval(区间插入)
- LeetCode OJ 之 Insert Interval (插入区间)
- (Java) LeetCode 56. Merge Intervalse —— 合并区间
- [LeetCode] Insert Interval 插入区间
- Leet Code 57 Insert Interval - 插入区间 - Java
- SDNU 1310.Cover Interval 区间合并之后求覆盖的区间长度
- [LeetCode] Insert Interval 插入区间
- 36.leetCode 57:Insert Interval(插入区间)
- LeetCode | Insert Interval(插入区间)
- 插入区间Insert Interval
- leetcode Insert Interval 区间插入