gwl999

博客园 首页 新随笔 联系 订阅 管理
  34 随笔 :: 0 文章 :: 0 评论 :: 2067 阅读

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;
      }

 

posted on   呓雫  阅读(104)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示