给出一个区间的集合,请合并全部重叠的区间。c++
示例 1:code
输入:[[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视为重叠区间
看到示例1时,咱们会发现经过比较当前位置的第二个元素和下一个位置的第一个元素的大小,前者大于等于后者,就能够将两区间合并成一个新区间,而后用着新区间的第二个元素继续比较便可,前者小于后者,咱们就能够把当前区间拿走了,跳到下一个区间重复上述步骤便可,若是你觉得就这样完了,那这就只能是个简单题了。class
咱们观察后会发现示例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为当前区间的值,重复上述步骤.
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; }