编程之美——2.19 区间重合判断

将区间按照x来排序(递增),然后依次判断目标区间的起始位置是否在这些区间上,例如判断区间 [a,b] 是否在区间 [c,d] , [e,f]之中,我们可以分析c d,e f的关系,按照之前所述的方法排好序之后[c,d] , [e,f]要么相交,要么相离。如果相交,那么e<d,否则e>=d。由此可以看到只要判断a是否在 [c, d]之间就好,如果在就将a增加到d,然后循环判断,知道所有区间都被遍历一遍,如果所有区间都是相连或者相交的,那么a的最大值一定是其区间相交的最大值,否则a会在某个相离点停滞,最后只要判断a是否大于b就可以了。


#include <iostream>
#include <algorithm>
using namespace std;


struct Pair{
  int b;
  int e;
};


int rangeCmp(const void* a, const void* b){
  return ((Pair*)a)->b-((Pair*)b)->b;
}
 
bool isCover(Pair& target, Pair ranges[], int n){
  qsort(ranges, n, sizeof(Pair), rangeCmp);
  int b = target.b, e = target.e;
  for(int i = 0; i < n; ++i){   
    if(b>=ranges[i].b && b <= ranges[i].e)
      b = ranges[i].e;
  }
  return b>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值