将区间按照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>