给出一个区间的集合,请合并所有重叠的区间。
示例 1:
输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].示例 2:
输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
解题思路:这道题首先思考一下会有哪些合并情况,如{1,3}和{2,4}或者{1,6}和{3,4},或者{1,3}{2,7}{3,9}这种连续重叠的区域,本来想比较相邻的首尾数字,但是可能会出现多个连续重叠区间,所以使用双指针的方法保存每个区间的首尾,这样在比较过程中就只需要将指针和每个数组比较即可。
需要首先对数组进行排序,保证开端是从小到大排列的。
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
if(intervals.size()<2) return intervals;
sort(intervals.begin(),intervals.end());//排序
vector<vector<int>> out;//存储结果
int first=intervals[0][0];
int last=intervals[0][1];
for(int i=1;i<intervals.size();i++){
if(last>=intervals[i][0]){
last=intervals[i][1]>last?intervals[i][1]:last;//末尾指针取较大的那个数
}
else{
out.push_back({first,last});
first=intervals[i][0];
last=intervals[i][1];
}
}
out.push_back({first,last});
return out;
}
};