区间合并算法

1、题目如图

2、算法代码

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

typedef pair<int, int> PII;

vector<PII>segs;

int n;
//merge函数是核心
void merge(vector<PII> &segs)
{
    vector<PII>res;
    
    sort(segs.begin(),segs.end());      //先将区间排序,这里要注意C++默认先将pair的左侧排序。
    
    int st = -2e9, ed = -2e9;       //设置初始的开头和·结尾,范围大于题目区间范围即可。
    
    for(auto seg:segs)    //遍历
    {
        if(ed < seg.first)
        {
            if(ed != -2e9)  res.push_back({st, ed});       //不是初始区间的话,将这个区间放入新容器。
            
            st = seg.first; ed = seg.second;            //更新区间  
        }
        else
            ed = max(ed, seg.second);           //更新区间大小
    }
    if( st != -2e9) res.push_back({st, ed});    //这里将最后的区间放进容器。 st != -2e9是为了防止原容器为空(没有任何区间)。
    
    segs = res;
}

int main()
{
    cin >> n;
    for (int i = 0; i < n; i ++ ) 
    {
        int l, r;
        scanf("%d%d", &l, &r);
        segs.push_back({l, r});
    }
    
    merge(segs);
    
    printf("%d",segs.size());
}
posted @   Medjay  阅读(58)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起