栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

[AcWing]803. 区间合并(C++实现)区间合并模板题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[AcWing]803. 区间合并(C++实现)区间合并模板题

[AcWing]803. 区间合并(C++实现)区间合并模板题
  • 1. 题目
  • 2. 读题(需要重点注意的东西)
  • 3. 解法
  • 4. 可能有帮助的前置习题
  • 5. 所用到的数据结构与算法思想
  • 6. 总结

1. 题目

2. 读题(需要重点注意的东西)

初步思路:

------------------------------------------------------代码实现思路-----------------------------------------------------------

  1. 读取各个区间存放在segs中;
  2. 对segs排序,合并区间,将合并的区间存放在res中;
  3. 返回res.size()得到合并后的区间数。

合并区间模板
① 输入的区间在维护的区间内;ed = ed;
② 输入的区间和维护的区间有交集; ed = seg.second;
综合①②得到 ed = max(ed,seg.second);

③ 完全没有交集,将当前维护的区间添加到res中,然后取下一个区间进行维护。

3. 解法

---------------------------------------------------解法---------------------------------------------------

#include
#include
#include
using namespace std;

typedef pair PII;
vector res,segs; // segs用于存放原区间,res存放合并后的区间
int n;

vector merge(vector &segs){
    sort(segs.begin(),segs.end());
    int st = -2e9, ed = -2e9;
    for(auto seg : segs){
        if(seg.first > ed){
            if(st != -2e9) res.push_back({st,ed});
            st = seg.first;
            ed = seg.second;
        }else ed = max(seg.second,ed);
    }
    // 最后一个区间
    if(st != -2e9) res.push_back({st,ed});
    return res;
}

int main(){
    cin >> n;
    for(int i = 0;i < n;i++){
        int l,r;
        cin >> l >> r;
        segs.push_back({l,r});
    }
    merge(segs);
    cout << res.size() << endl;
    return 0;
}
4. 可能有帮助的前置习题
  • [AcWing]789. 数的范围(C++实现)整数二分模板题
  • [AcWing]795. 前缀和(C++实现)一维前缀和模板题
5. 所用到的数据结构与算法思想
  • C++模板类型—pair
  • C++数据结构—vector容器
  • C++头文件—algorithm
6. 总结

本题使用了区间合并以及贪心的思想。
在数据结构方面使用了vector、pair等数据结构,是一道比较综合的区间合并模板题。
推荐完全背下来。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/433633.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号