1. 简述
给定一个源区间[x,y] (y>=x)和N个无序目标区间[x1,y1][x2,y2][x3,y3]...[xn][yn],判断[x,y]是否在目标区间内。
2. 思路
这个比较简单,合并目标区间,判断源区间是否在目标区间内即可。具体过程如下:
第一步,先把目标区间排序。 第二步,从第一个区间开始,遍历首先找到一个[xi,yi],使得 x[i]<= X <= y[i],如果找不到,说明不在目标区间内,如果找到了并且yi>=y,那么结束工作,源区间在目标区间内,如果找到了,但是yi<y,那么还需要继续遍历,进入第三步。 第三步,继续遍历[xi,yi],如果xi>y(i-1),那么区间断裂,源区间不在目标区间内,否则如果yi>=y,找到了,源区间在目标区间内,否则继续寻找。 第四步,如果都遍历结束了,但是没有发现源区间一定在目标区间内,说明源区间必然不在目标区间内。第一步,N*LogN,第二步+第三步,N,第四步,1。复杂度为O(N LogN)
3. 参考
编程之美,2.19,区间重合判断
#include <stdio.h>
#define N 11
int Is_Include(int x[], int y[], int X, int Y, int n);
int main()
{ int x[N] = {1,2,7,8,99,143,19,55,33,32,121}; int y[N] = {3,3,20,15,200,202,25,75,35,39,155};int X = 5;
int Y = 18;int i = 0;
int flag = 0; printf("The Object Regions Are:\n"); for (i = 0; i < N; i++) { if(i == 5) { printf("\n"); }printf("[%d,%d]\t\t", x[i], y[i]);
} printf("\n"); flag = Is_Include(x, y, X, Y, N); if(flag) { printf("The Region [%d,%d] Is In The Object Region.\n", X, Y); } else { printf("The Region [%d,%d] Is Not In The Object Region.\n", X, Y); }return 0;
} int Is_Include(int x[], int y[], int X, int Y, int n){ int i = 0; int j = 0; int tmpX = 0; int tmpY = 0; int maxY = y[0];for(i = 1; i < N; i++)
{ tmpX = x[i]; tmpY = y[i];if(y[i] > maxY)
{ maxY = y[i]; } j = i - 1;while((j >= 0) && (x[j] > x[j+1]))
{ x[j+1] = x[j]; y[j+1] = y[j];j--;
}x[j+1] = tmpX;
y[j+1] = tmpY; }printf("The Object Regions Are:\n");
for (i = 0; i < N; i++) { if(i == 5) { printf("\n"); }printf("[%d,%d]\t\t", x[i], y[i]);
} printf("\n"); if ((Y > maxY) || (X < x[0])) { return 0; } if(Y <= y[0]) { return 1; } for (i = 0; i < N; i++) {if ( y[i] < X )
{ continue; } else { break; } }if (x[i] <= X && i < N)
{ if( y[i] > Y ) { return 1; } } else { return 0; }tmpY = y[i];
tmpX = x[i];for (i = i + 1; i < N; i++)
{ if (x[i] > tmpY) { return 0; } if (y[i] > tmpY) { tmpY = y[i]; if (tmpY >= Y) { return 1; } } } return 0;}