1、题目描述
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.
2、问题描述:
- 区间合并,如果两个区间有重叠那么合并成一个区间。
3、问题关键:
- 对区间按照一个元素排序,如果前区间的end小于后面区间的start,那么这个区间是不能被合并的。
- 建立自己的比较函数,区间的大小。
- 如果end > start,那么说明有重叠,但是还要比较两个区间的end哪个更大。
4、C++代码:
/**
* 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:
bool static cmp(Interval a, Interval b) {//建立自己的比较函数。。
return a.start < b.start;
}
vector<Interval> merge(vector<Interval>& intervals) {
vector<Interval> res;
if (intervals.empty()) return res;
sort(intervals.begin(), intervals.end(), cmp);//排序
int st = intervals[0].start, ed = intervals[0].end;
for (int i = 1; i < intervals.size(); i ++ ) {
if (ed < intervals[i].start){//如果ed 小于 start,那么不可能重叠了。。。。
res.push_back({st, ed});
st = intervals[i].start;
ed = intervals[i].end;
}
else
ed = max(ed, intervals[i].end);//更新end的时候记得比较一下哦。
}
res.push_back({st, ed});//完了一定的把最后一个区间加进去呀。
return res;
}
};