56.合并区间
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间
示例 1:
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
这个题完全没有思路,记录一下
思路:将数组排序,刚知道原来sort还可以用来给二维数组按照第一行的值排序。stl也太棒了吧。排好之后就好办了,区间中,左元素升序排列,当一个区间的右元素大于另一个区间的左元素时,一定可以重叠,这个重叠之后的区间,左元素是压入的第一个区间的左元素,右元素是所有压入的区间中最大的一个右元素。
class Solution {
public:
vector<vector<int>> merge(vector<vector<int>>& intervals) {
if(intervals.size()==0)
{
return {};
}
sort(intervals.begin(),intervals.end());
vector<vector<int>> merge;
for(int i=0;i<intervals.size();++i)
{
int L=intervals[i][0],R=intervals[i][1];
//找到了左元素比上次记录的右元素的值大,这前面的集合重叠完毕,开始叠下一个集合
if(!merge.size()||merge.back()[1]<L)
{
merge.push_back({L,R});
}else
//将重叠的集合中的最大右值给结果作为右值
{
merge.back()[1]=max(merge.back()[1],R);
}
}
return merge;
}
};