区间合并【pair、sort】

有交集(包括端点)的区间进行合并
802. 区间和 - AcWing题库

例如,现在有这样一个数据

1 2
2 4 
5 6
7 8
7 9

最终合并的结果就是

  • 1 —— 4
  • 5 —— 6
  • 7 —— 9

得到三个区间

第一步:按照区间左端点排序

第二步:扫描整个区间(扫描过程中,合并区间)

维护当前的区间,例如

  • 左端点:st
  • 右端点:ed

存在以下几种情况

区间内

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GKGtoKS3-1684419626980)(assets/image-20230518220234-4jwf4c8.png)]

在这种情况下,st和ed都不需要变化

有交集

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kS6yDHMT-1684419626981)(assets/image-20230518220336-2lqk3s9.png)]

此时修改ed,也就是这样

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dwZO18qG-1684419626981)(assets/image-20230518220442-cuhs6q2.png)]

没有交集

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5Jgnkrjy-1684419626982)(assets/image-20230518220401-p41euf7.png)]

因为前面已经将左端点 从小到大 排序,所以很后面的情况只会在紫色点后面,而不会出现在前面

  • 然后将此时的st和ed放入答案中
  • 并更新st和ed

解决代码

#include<iostream>
#include<algorithm>
#include<vector>

using namespace std;


typedef pair <int , int > pii;

vector<pii> nums;

void merge(vector<pii> &nums){
    
    
    vector<pii> res;
  
    int st = -2e9 , ed = -2e9;
  
    for(auto item : nums){
    
    
      
        if(item.first > ed){
    
    
            if(st != -2e9) res.push_back({
    
    item.first , item.second});
          
            st = item.first , ed = item.second;
          
        }else{
    
    
            ed = max(ed , item.second);
        }
      
    }
  
    if(st != -2e9){
    
    
        res.push_back({
    
    st , ed});
    }
  
    nums = res;
  
}

int main(){
    
    
    int n ;
  
    cin >> n;
  
    int l , r;
  
    for(int i = 0 ; i <n ; i ++){
    
    
        cin >> l >> r;
        nums.push_back({
    
    l , r});
    }
  
    sort(nums.begin() , nums.end());
  
    merge(nums);
  
    cout << nums.size();
  
    return 0;
}

使用pair存放左右端点

  • first:左端点
  • second:右端点
typedef pair <int , int > pii;

vector<pii> nums;

区间合并模板

sort排序时,是默认排序first,当first相等时,排序second

void merge(vector<pii> &nums){
    
    
    vector<pii> res;
  
    int st = -2e9 , ed = -2e9;
  
    for(auto item : nums){
    
    
      
        if(item.first > ed){
    
    
            if(st != -2e9) res.push_back({
    
    item.first , item.second});
          
            st = item.first , ed = item.second;
          
        }else{
    
    
            ed = max(ed , item.second);
        }
      
    }
  
    if(st != -2e9){
    
    
        res.push_back({
    
    st , ed});
    }
  
    nums = res;
  
}
  • 设置默认值为2e9,因为题目默认为109

  • 当前区间严格在 维护区间 左边

    ——(对应没有交集的情况)

  • 在区间里面

    (对应有交集 + 区间内)

猜你喜欢

转载自blog.csdn.net/qq_22841387/article/details/130756541
今日推荐