合并区间
1.题目描叙
给出一个区间的集合,请合并所有重叠的区间。
示例 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视为重叠区间
2.思路
看到示例1时,我们会发现通过比较当前位置的第二个元素和下一个位置的第一个元素的大小,前者大于等于后者,就可以将两区间合并成一个新区间,然后用着新区间的第二个元素继续比较即可,前者小于后者,我们就可以把当前区间拿走了,跳到下一个区间重复上述步骤即可,如果你以为就这样完了,那这就只能是个简单题了。
我们观察后会发现示例1是有序的,第一个元素和第二个元素都是不递减的,可如果打乱一下,就不能按我们上述思路去解了,所以首先我们第一步就是给区间排序,然后才是上面的方法。
给定区间集合nums
设置[left,right]存储合并后区间
1.对nums进行排序,left,right取第一个区间的左右边界;
2.比较right和nums[i][0]的大小
1.right>=nums[i][0]:right=right>nums[i][1]?right:nums[i][1]//如果当前区间的右边界大于right,更新right
2.right<nums[i][0]:即两区间没有重叠,存储[left,right]后,更新left,right为当前区间的值,重复上述步骤.
3.代码实现
vector<vector<int>> merge(vector<vector<int>>& intervals) {
if(intervals.size()==0)
return {};
sort(intervals.begin(),intervals.end());
vector<vector<int>>ans;
int left=intervals[0][0];//用来存储合并区间的左右边界
int right=intervals[0][1];
for(int i=1;i<intervals.size();i++){
if(intervals[i][0]<=right){
right=intervals[i][1]>right?intervals[i][1]:right;
}
else{
ans.push_back({left,right});
left=intervals[i][0];
right=intervals[i][1];
}
}
ans.push_back({left,right});
return ans;
}