56. 合并区间
给出一个区间的集合,请合并所有重叠的区间。
示例 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] 可被视为重叠区间。
这道题我们不妨先把区间(x,y)排序,x小的排在前面,x一样的y小的排在前面,同时我们给每一个区间起点标记0,终点标记1,那么示例1的区间经过排序后的标记在数轴上就是 1 2 3 6 8 10 15 18 , 即0 0 1 1 0 1 0 1。 类似于0 0 1 1的区间是可以合并的,也就是我们找到距离最远的线段端点,即有多少个连续的0,就往后找多少个1
vector<vector<int>> merge(vector<vector<int>>& intervals) { vector<pair<int,bool>> tag; for(int i=0;i<intervals.size();i++) { tag.push_back(make_pair(intervals[i][0],0)); tag.push_back(make_pair(intervals[i][1],1)); } sort(tag.begin(),tag.end()); vector<vector<int>>ans; vector<int> tmp(2,0); int cnt=0; for(int i=0;i<tag.size();i++) { if(tag[i].second==0) { if(cnt==0) { tmp[0]=tag[i].first; } cnt++; } else { if(cnt==1) { tmp[1]=tag[i].first; ans.push_back(tmp); } cnt--; } } return ans; }