算法刷题笔记 区间合并(C++实现)

文章目录

题目描述

  • 给定n个区间[li,ri],要求合并所有有交集的区间。
  • 注意如果在端点处相交,也算有交集。
  • 输出合并完成后的区间个数。
  • 例如:[1,3][2,6]可以合并为一个区间[1,6]

输入格式

  • 第一行包含整数n
  • 接下来n行,每行包含两个整数lr

输出格式

  • 共一行,包含一个整数,表示合并区间完成后的区间个数。

数据范围

  • 1 ≤ n ≤ 100000,
  • −10^9 ≤ li ≤ ri ≤ 10^9

基本思路

本题的思路如下

  1. 将所有的区间按照左端点从小到大的顺序进行排序;
  2. 取出当前的第一个区间,并判断其与后面的一个区间是否有交集。排序后,一个区间和其后面的一个区间只有三种可能的容斥关系(这是因为后一个区间的左端点一定在当前区间的左端点处或更右边):后面一个区间包含在前一个区间中、后面一个区间和前一个区间有交集但是互不包含、后面一个区间与前面的区间没有相交的元素。
  3. 如果后面一个区间与当前区间有交集,则求出两个区间的并集,更新当前包含该区间的最大合并区间;如果后面一个区间与当前区间没有交集,则说明后面一个区间的左端点在当前合并区间的右端点的右侧,则将当前的合并区间作为最终的一个合并区间放入结果集合中,然后取出后面一个区间重复上述过程。

解题代码

cpp 复制代码
#include <cstdio>
#include <utility>
#include <vector>
#include <algorithm>
using namespace std;

vector<pair<int, int> > intervals;
vector<pair<int, int> > merge_result;

int main(void)
{
    int n;
    scanf("%d", &n);
    for(int i(0); i < n; ++i)
    {
        int left, right;
        scanf("%d%d", &left, &right);
        intervals.push_back({left, right});
    }
    sort(intervals.begin(), intervals.end());
    int left = -2e9, right = -2e9;
    for(auto item : intervals)
    {
        // 当前遍历到的区间是否与局部合并的区间无相交的情况,则添加一个结果
        if(item.first > right)
        {
            if(right != -2e9) merge_result.push_back({left, right});
            left = item.first;
            right = item.second;
        }
        // 当前遍历到的区间与局部合并的区间有相交
        else right = max(right, item.second);
    }
    //将最终的结果放入,考虑到输入为空的情况,需要增加一条判定
    if(left != -2e9 && right != -2e9) merge_result.push_back({left, right});
    printf("%d", merge_result.size());
    return 0;
}

其他说明

  • 在C++中,pair类型的向量使用sort函数进行排序时,会根据每个有序对的第一个元素进行排序。
相关推荐
2301_764441331 小时前
Python构建输入法应用
开发语言·python·算法
love530love1 小时前
【笔记】ComfUI RIFEInterpolation 节点缺失问题(cupy CUDA 安装)解决方案
人工智能·windows·笔记·python·插件·comfyui
愚戏师2 小时前
MySQL 数据导出
数据库·笔记·mysql
AI科技星2 小时前
为什么变化的电磁场才产生引力场?—— 统一场论揭示的时空动力学本质
数据结构·人工智能·经验分享·算法·计算机视觉
摇滚侠2 小时前
2025最新 SpringCloud 教程,教程简介,笔记01
笔记·spring cloud
TheLegendMe3 小时前
贪心+线程安全单例
算法·哈希算法
豐儀麟阁贵3 小时前
8.5在方法中抛出异常
java·开发语言·前端·算法
胖咕噜的稞达鸭3 小时前
算法入门:滑动窗口--->找到字符串中所有的字母异位词,串联所有的子串,最小覆盖子串
数据库·redis·算法
滨HI03 小时前
C++ opencv简化轮廓
开发语言·c++·opencv
小青龙emmm3 小时前
2025级C语言第二次周测(国教专用)题解
c语言·开发语言·算法