写点什么

区间合并算法

作者:秋名山码民
  • 2022 年 5 月 11 日
  • 本文字数:873 字

    阅读完需:约 3 分钟

何为区间合并?

区间合并,肯定是要有区间的,我们先来说什么是区间:

何为区间

区间一般有一个左端点一个右端点



我们可以使用一个结构体来定义,其中既包括左节点,也包括右节点


struct Interval {    int left, right;};
复制代码

区间合并

上面我们说明了什么是区间,接下来我们来说什么是区间合并,


[[1,3],[2,6],[8,10],[15,18]]


合并为:[[1,6],[8,10],[15,18]]


区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]


也就是有交集的区间进行一个合并


区间左端点排序 start,end 进行维护

三种情况,1.在其中 不用动了


2.超过 维护区间变长


3.不在其中(没有交集) 直接导出来,更新区间


我们来看代码的实现:


#include <iostream>#include <vector>#include <algorithm>using namespace std ;typedef pair<int,int> pii ;vector<pii> nums,res ;int main(){    int st=-2e9,ed=-2e9 ;                           //ed代表区间结尾,st代表区间开头    int n ;    scanf("%d",&n) ;     while(n--)    {        int l,r ;         scanf("%d%d",&l,&r) ;        nums.push_back({l,r}) ;    }    sort(nums.begin(),nums.end()) ;                 //按左端点排序    for(auto num:nums)                       {        if(ed<num.first)                            //情况1:两个区间无法合并        {            if(ed!=-2e9) res.push_back({st,ed}) ;   //区间1放进res数组            st=num.first,ed=num.second ;            //维护区间2        }        //情况2:两个区间可以合并,且区间1不包含区间2,区间2不包含区间1        else if(ed<num.second)              ed=num.second ;                         //区间合并    }  

//注:排过序之后,不可能有区间2包含区间1
if(st!=-2e9&&ed!=-2e9) res.push_back({st,ed});
//考虑循环结束时的st,ed变量,此时的st,ed变量不需要继续维护,只需要放进res数组即可。因为这是最后的一个序列,所以不可能继续进行合并。

printf("%d",res.size()) ; //输出答案 return 0 ;}
复制代码



发布于: 刚刚阅读数: 2
用户头像

卷不死,就往…… 2021.10.19 加入

2019NOIP退役成员,华为云享专家,阿里云专家博主,csdn博主,努力进行算法分享,有问题欢迎私聊

评论

发布
暂无评论
区间合并算法_算法_秋名山码民_InfoQ写作社区