Given a collection of intervals, merge all overlapping intervals.
Example 1:
Input: [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].
Example 2:
Input: [[1,4],[4,5]]
Output: [[1,5]]
Explanation: Intervals [1,4] and [4,5] are considered overlapping.
class Solution {
public:
/* 按照start 从小打到排序
* 每次拿出一个interval 判断start 是否小于当前要返回的结果的 end (即判断与之前部分是否有交集)
*
* */
vector<Interval> merge(vector<Interval>& intervals) {
if(intervals.empty()) return {};
vector<Interval> ret;
// 使用匿名函数直接进行比价
sort(intervals.begin(), intervals.end(),
[](Interval &a, Interval &b){return a.start < b.start;});
ret.push_back(intervals[0]);
for(auto &inter : intervals){
// 没有交集
if(ret.back().end < inter.start) ret.push_back(inter);
// eg: [2, 9] [3, 4] 则不用更新当前end 只有[2, 9] [3, 12]这种才要更新end
else if(ret.back().end < inter.end) ret.back().end = inter.end;
}
return ret;
}
};
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:
Input: intervals = [[1,3],[6,9]], newInterval = [2,5] Output: [[1,5],[6,9]]
class Solution {
public:
/* 同merge interval 类似
* 初始是排好序的 可以把newInterval 插在排序后的正确位置
* 分三阶段:
* 把没有重合的记录在res中
* 处理重合区间
* 记录剩余的没有重合的区间
* */
vector<Interval> insert(vector<Interval>& intervals, Interval newInterval) {
int cur=0, len=intervals.size();
vector<Interval> ret;
while(cur < len && intervals[cur].end < newInterval.start){
ret.push_back(intervals[cur]);
cur++;
}
// 设newInterval 始终维护一个覆盖相交区间
while(cur < len && intervals[cur].start <= newInterval.end ){
newInterval.start = min(newInterval.start, intervals[cur].start);
newInterval.end = max(newInterval.end, intervals[cur].end);
cur++;
}
ret.push_back(newInterval);
while(cur < len ){
ret.push_back(intervals[cur]);
cur++;
}
return ret;
}
};