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的最后一组值)

参考链接:https://leetcode-cn.com/problems/merge-intervals/solution/c-ji-yu-two-points-he-pai-xu-de-jian-ji-shi-xian-f/

代码:

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;
    }
};

 

posted @ 2020-04-13 14:08  thefatcat  阅读(162)  评论(0编辑  收藏  举报