算法刷题笔记 区间合并(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函数进行排序时,会根据每个有序对的第一个元素进行排序。
相关推荐
喜欢你,还有大家8 分钟前
Linux笔记10——shell编程基础-4
linux·运维·服务器·笔记
神齐的小马10 分钟前
计算机网络学习笔记
笔记·学习·计算机网络
胡萝卜3.044 分钟前
数据结构初阶:详解单链表(一)
数据结构·笔记·学习·单链表
君鼎2 小时前
More Effective C++ 条款01:仔细区别 pointers 和 references
c++
艾醒2 小时前
大模型面试题剖析:大模型微调与训练硬件成本计算
人工智能·后端·算法
YJlio2 小时前
第17章|PowerShell 安全警报——高分学习笔记(运维实战向)
笔记·学习·安全
啊嘞嘞?2 小时前
力扣(滑动窗口最大值)
算法·leetcode·职场和发展
快递鸟2 小时前
ISV系统开发中物流接口的第三方模块对接:技术选型与集成实践
算法
墨染点香2 小时前
LeetCode 刷题【53. 最大子数组和】
数据结构·算法·leetcode
2501_924879263 小时前
客流特征识别误报率↓76%!陌讯多模态时序融合算法在智慧零售的实战解析
大数据·人工智能·算法·目标检测·计算机视觉·视觉检测·零售