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] 可被视为重叠区间。
思想:
双指针,一个指针(v)负责保存,另一个指针(u)负责浏览,比较两个指针的值,进行不同的操作
先对整个vector进行排序
case1:v[1,3] u[4,5] (没有共同项)v的右值小于u的左值,保存v,然后将u的值赋给v
case2: v[1,4] u[2,3] (没有共同项或边界相邻)v的右值大于等于u的右值,u++
case3: v[1,3] u[2,4] (有共同项) v的右值小于u的左值,将u的左值赋给v的右值,u++
注:最后一种特殊情况的处理(也就是浏览指针移动到最后,但是还是没有压入数组中,
需要特殊处理,注意此时u已超出界限,v对应的值是vector的最后一组值)
代码:
class Solution { public: vector<vector<int>> merge(vector<vector<int>>& intervals) { if(intervals.size()==0 || intervals.size()==1) return intervals; int u=0,v=0; //v为保存,u为浏览 vector<vector<int>> ans; std::sort(intervals.begin(), intervals.end()); while(u<intervals.size()){ if(intervals[v][1]<intervals[u][0]){ //eg:v [1,3] u [4,5] ans.push_back(intervals[v]); v=u; } else if(intervals[v][1]>=intervals[u][1]){ //eg:v:[1,4] u[2,3] u++; } else{ //eg:v:[1,3] u:[2,4] intervals[v][1] = intervals[u][1]; u++; } } ans.push_back(intervals[v]); return ans; } };