区间合并笔记

文章目录



什么是区间合并

区间合并是指给定多个区间,让你将重合的区间合并为一个区间


怎么做区间合并

区间合并类问题大多三个办法:

  • 按左端点排序
  • 按右端点排序
  • 按左右端点双值排序

AcWing 803. 区间合并

题目链接:https://www.acwing.com/activity/content/problem/content/837/

思路解析

  • 我们按左端点大小将区间排序,排完序后从每个区间左端点开始遍历,我们会发现有三种情况
    • B区间在A
    • C区间有一部分与A重合
    • D区间在A
  • 我们的思路很明了了,通过两个指针:st(start),ed(end) 来标记我们正在维护的A数组的左右端点,往后遍历,处理三种情况
    • 如果遇到B:左端点不动,右端点也不动
    • 如果遇到C:左端点不动,右端点更新为C的右端点,也就是将A,C区间合并了
    • 如果遇到D:左右端点更新为D的左右端点,相当于现在改为维护D区间

my - CODE

cpp 复制代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

typedef pair<int, int> pii;

vector<pii> segs;			// 存储区间左右端点

int main()
{
    int n, l, r;
    int ans = 0;
    cin >> n;
    
    while (n -- ){
        scanf("%d%d", &l, &r);
        
        segs.push_back({l, r});
    }
    
    sort(segs.begin(), segs.end());		// 以左端点优先排序
    
    int st = -1e9 - 1, ed = -1e9 - 1;	// 一开始的区间初始化为一个不可能的区间
    for(auto seg : segs){
        if(seg.first <= ed) ed = max(ed, seg.second);	// 有重合,右端点取最大
        else{			// 无重合,更新维护的区间
            ans++;
            st = seg.first;
            ed = seg.second;
        }
    }
    
    cout << ans << endl;
}

dalao の CODE

cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

typedef pair<int, int> PII;

void merge(vector<PII> &segs)
{
    vector<PII> res;

    sort(segs.begin(), segs.end());

    int st = -2e9, ed = -2e9;
    for (auto seg : segs)
        if (ed < seg.first)
        {
            if (st != -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});

    segs = res;
}

int main()
{
    int n;
    scanf("%d", &n);

    vector<PII> segs;
    for (int i = 0; i < n; i ++ )
    {
        int l, r;
        scanf("%d%d", &l, &r);
        segs.push_back({l, r});
    }

    merge(segs);

    cout << segs.size() << endl;

    return 0;
}

作者:yxc
链接:https://www.acwing.com/activity/content/code/content/40108/
来源:AcWing
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • dalao将合并统计区间的过程抽出来单独写了个merge()函数,复用性和可读性更强
  • 而且将合并后的区间按秩存入了一个res空间,对于本题可能没有卵用,但是在其他区间合并问题中可能会用到合并后的区间
  • 不愧是dalao啊,orz %%%%%%
相关推荐
Once_day11 分钟前
C++之《程序员自我修养》读书总结(1)
c语言·开发语言·c++·程序员自我修养
Trouvaille ~21 分钟前
【Linux】TCP Socket编程实战(一):API详解与单连接Echo Server
linux·运维·服务器·网络·c++·tcp/ip·socket
觉醒大王22 分钟前
强女思维:着急,是贪欲外显的相。
java·论文阅读·笔记·深度学习·学习·自然语言处理·学习方法
偷吃的耗子26 分钟前
【CNN算法理解】:CNN平移不变性详解:数学原理与实例
人工智能·算法·cnn
三水不滴31 分钟前
计网:输入网址到网页显示
经验分享·笔记·计算机网络
坚果派·白晓明32 分钟前
在鸿蒙设备上快速验证由lycium工具快速交叉编译的C/C++三方库
c语言·c++·harmonyos·鸿蒙·编程语言·openharmony·三方库
小镇敲码人39 分钟前
深入剖析华为CANN框架下的Ops-CV仓库:从入门到实战指南
c++·python·华为·cann
dazzle1 小时前
机器学习算法原理与实践-入门(三):使用数学方法实现KNN
人工智能·算法·机器学习
那个村的李富贵1 小时前
智能炼金术:CANN加速的新材料AI设计系统
人工智能·算法·aigc·cann
张张努力变强2 小时前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl