合并区间 merge-intervals
题目描述
给出一组区间,请合并所有重叠的区间。
例如,
给出[1,3],[2,6],[8,10],[15,18],
返回[1,6],[8,10],[15,18].
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].
解题思路
- 首先对intervals数组排序,自定义cmp排序规则时,如果起点不同,则按起点start递增排序,如果起点相同,则按终点end递增排序。
- 注意,c++类中自定义sort的cmp函数时,要加上static
- 定义res数组存放合并后的区间结果,初始存入intervals[0]
- 从第二个元素开始遍历,每次将 intervals[i] 与res数组中的最后一个区间 res.back() 进行比较,分为重叠和不重叠两种情况。
- 存在重叠时,直接修改res最后一个区间的end即可,即合并两个区间
res.back().end = max(res.back().end, intervals[i].end) - 不存在重叠时,直接将当前区间intervals[i]加入res即可,即不需要合并,产生新的区间
/**
* 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:
//注意,c++类中自定义sort的cmp函数时,要加上static
static bool cmp(Interval a, Interval b) {
if(a.start != b.start) {
//如果起点不同,则按起点递增排序
return a.start < b.start;
} else {
//如果起点相同,则按终点递增排序
return a.end < b.end;
}
}
vector<Interval> merge(vector<Interval> &intervals) {
vector<Interval> res;
int size = intervals.size();
if(!size) return res;
sort(intervals.begin(), intervals.end(), cmp);
res.push_back(intervals[0]);
for(int i = 1; i < size; i ++) {
Interval temp = intervals[i];
//如果两个区间存在重叠
if(temp.start <= res.back().end) {
res.back().end = max(res.back().end, temp.end);
} else {
//如果两个区间不存在重叠
res.push_back(temp);
}
}
return res;
}
};