ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

磊磊零基础打卡算法:day11 c++ 区间合并

2022-05-13 00:34:44  阅读:255  来源: 互联网

标签:int segs 交集 vector c++ 磊磊 区间 打卡 排序


5.12

区间合并问题:

  • 题目描述:给出n段区间,如果区间内,l -r存在交集,那么就可以合并,需要更新区间,如果不存在交集,那么就直接将单独的区间个数++,最后返回区间合并后的区间个数

  •  

     

  • 解题思路:

    • 将区间通过pair进行归类,并排序(可以去除包含的区间,并且可以从小到大排序也方便进行插入,计数);

    • 找到没有交集的前后区间,进行计数;

    • 找到有交集的区间,进行更换区间;

    • #include "iostream"
      #include "algorithm"
      #include "vector"
      
      using namespace std;
      
      typedef pair<int, int> pii;
      vector<pii> segs;
      int n;
      
      void merge(vector<pii> &segs) {
          sort(segs.begin(), segs.end());
          //排序后可以将本来是完全子区间的直接去重掉,sort对于pair排序的话,是先对前面进行排序,然后再对后排
          vector<pii> res;
          int st = -2e9, ed = -2e9;
          //将一开始的左边和右边都置为负无穷
          for (auto seg: segs) {
              //对所有segs里面的值进行遍历
              if (ed < seg.first) {
                  //如果是两条线段的话,原来线段的末尾<后面一条线段的最开始,那么就是需要进行计数加加的时候;
                  if (st != -2e9)
                      //如果不是第一次的话 ,就直接加上计数
                      res.push_back({st, ed});
                  st = seg.first, ed = seg.second;//这里才是第一次的初始化。
              } else ed = max(ed, seg.second);//否则就需要更新区间
          }
          if (st != -2e9)
              //判断是不是原来的segs是不是空的,如果是空的就不加入,如果不是空的,就加入原来segs的最后一个
              res.push_back({st, ed});
          segs = 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 << segs.size();
          return 0;
      }

 

标签:int,segs,交集,vector,c++,磊磊,区间,打卡,排序
来源: https://www.cnblogs.com/gwl999/p/16265108.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有