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

文章目录

题目描述

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

输入格式

  • 第一行包含整数n。
  • 接下来n行,每行包含两个整数l和r。

输出格式

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

数据范围

  • 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函数进行排序时,会根据每个有序对的第一个元素进行排序。
相关推荐
学习论之费曼学习法8 分钟前
无人值守AI内容矩阵实战(8):标题 A/B 实验的 6 个工程实现细节,隔日对比与自动判胜
人工智能·python·算法·矩阵·自动化·a/b测试·内容矩阵
Carl_奕然23 分钟前
【机器视觉】最强算法之:3D高斯泼溅(3D Gaussian Splatting)
人工智能·python·算法·目标检测·计算机视觉·3d
SunkingYang25 分钟前
C++14 vs C++17:新特性对比与用法指南
c++·新特性·用法·c++14·示例·c++17
w_zero_one27 分钟前
算法--桶思想
java·开发语言·算法
dire_7771 小时前
TH26027A开尔文夹子线缆问题导致同惠TH2822电桥测量不准
笔记
wordbaby1 小时前
同一次请求里的两道锁:图解搞懂国密 SM2 与 SM3
算法
SunkingYang1 小时前
C++ Lambda 表达式原理详解
c++·lambda·理论·原理·表达式
宝绿特塑业再生科技1 小时前
板材收缩率不稳,户外家具装配尺寸为何对不上:从切割尺寸变化到接缝不一的系统性排查与对策
笔记·科技·学习·生活·户外家具·hdpe再生颗粒·hdpe
xiaoye-duck2 小时前
《C++ 工具库实战》GTest 单元测试:断言、全局环境、局部夹具与底层原理
c++·单元测试·第三方库
学逆向的2 小时前
C++ 匿名命名空间
开发语言·c++·网络安全