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.
NOTE: input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature.
给定间隔的集合,合并所有重叠的间隔。
对于这道题,题目要求是对于一系列的时间间隔,将它们进行合并。
从题目给出的例子我们可以看出,这个问题实际上就是一个区间的并集问题。如果给定的时间间隔是有序的,那么在合并上是非常方便快捷的。
但是,给定的序列未必是有序的。因此,我们需要对这个序列进行排序,也就是需要重写一下cmp函数。
按照从小到大的顺序排序之后,我们只需要对res最后一个元素的结束时间与新加入元素的开始时间进行比较即可:
int x = []() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
return 0;
}();
class Solution {
public:
static bool cmp(const vector<int> &x, const vector<int> &y){
return x[0] < y[0]|| (x[0]== y[0] && x[1]< y[1]);
}
vector<vector<int>> merge(vector<vector<int>>& intervals) {
vector<vector<int>> res = {};
if(intervals.size() == 0)
return res;
sort(intervals.begin(), intervals.end(), cmp);
res.push_back(intervals[0]);
for(int i = 1;i<intervals.size();i++){
if(res.back()[1] < intervals[i][0])
res.push_back(intervals[i]);
else
res.back()[1] = max(res.back()[1], intervals[i][1]);
}
return res;
}
};