【算法基础课模板笔记+注释】 基础算法13 --- 区间合并

声明

本文资料参考acwing算法基础课
地址:https://www.acwing.com

概述
  1. 解决问题:求多个区间合并的问题
  2. 平均时间复杂度为O(n)
  3. 简单贪心(或者双指针)
模板记忆

这个模板分为两个部分:

  1. 排序:把区间按照左边缘递增排序
  2. 使用双指针依次合并:遍历到新区间查看是否可以合并
模板代码
void merge(vector &segs)  // 把segs数组中存的区间合并
{
    vector res;  // 结果数组
    sort(segs.begin(), segs.end());  // 首先对segs进行排序,按照区间左边缘递增
    int l = -2e9, r = -2e9;  // 初始化当前区间
    for (int i = 0; i < segs.size(); i ++ )
    {
        if (i == 0) l = segs[i].first, r = segs[i].second;  // 第一次先把l,r设定为当前区间
        else if (segs[i].first > r)  // 遍历到的区间左侧比当前区间右侧还大,不能合并
        {
            res.push_back({l, r});  // 存下当前区间并且把当前区间改为遍历的区间
            l = segs[i].first, r = segs[i].second;
        }
        else
        {
            r = max(r, segs[i].second);  // 可以合并则合并
        }
    }
    if (l != 2e-9) res.push_back({l, r});  // 最后一次注意还有一个当前区间没有存
    segs = res;  // 重新存到segs
}

你可能感兴趣的:(算法基础课模板笔记,算法,贪心算法,排序算法)