56.合并区间

😄56.合并区间

给出一个区间的集合,请合并所有重叠的区间。

示例 1:

  • 输入: intervals = [[1,3],[2,6],[8,10],[15,18]]
  • 输出: [[1,6],[8,10],[15,18]]
  • 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

示例 2:

  • 输入: intervals = [[1,4],[4,5]]
  • 输出: [[1,5]]
  • 解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间。
  • 注意:输入类型已于2019年4月15日更改。 请重置默认代码定义以获取新方法签名。

思路

基本思想

一旦两个区间出现重叠,就将其合并,合并之后的新区间与后面的区间进行比较

由于区间是乱序存放的,所以需要先进行排序,这样遍历时才会取出相邻的区间

452 435 思路类似

执行流程

  1. 对集合进行排序
  2. 判断flag是否与当前区间重叠,重叠之后合并成新的flag
  3. 不重叠更新flag,直到遍历结束

代码

根据以上分析,得出以下代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        //先进行排序
        sort(intervals.begin(),intervals.end(),[](vector<int>& v1,vector<int>& v2){
            if(v1[0]==v2[0])   
                return v1[1]<v2[1];
            return v1[0]<v2[0];
        });
        //从第一个区间开始判断
        vector<int> flag=intervals[0];
        //初始时结果容器为空
        vector<vector<int>> res;
        for(int i=1;i<intervals.size();++i){
            //出现重叠更新
            if(intervals[i][0]<=flag[1]){
                //更新右边界即可,取max是为了防止出现真子集的情况
                flag[1]=max(intervals[i][1],flag[1]);
            }
            //没有出现重叠,需要更新flag和res
            else{
                res.push_back(flag);
                flag=intervals[i];
            }
        }
        //最后一个区间不要忘记,dan'du'c
        res.push_back(flag);
        return res;
    }
};

总结

主要是模拟合并的过程,出现重叠就合并,没有重叠就把当前区间加入结果集

遍历到最后一个区间,不管是合并还是不合并,都需要单独将其合并到结果集,因为代码判断的逻辑是不重叠才加入结果集,然后才更新flag,所以最后一个flag无法加入结果集,需要单独处理