博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编程之美-2.19-区间重合判断
阅读量:4597 次
发布时间:2019-06-09

本文共 1958 字,大约阅读时间需要 6 分钟。

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

 

转载于:https://www.cnblogs.com/wulijun/archive/2012/03/06/2381287.html

你可能感兴趣的文章
%s的用法
查看>>
调用底层不能直接访问的类和方法
查看>>
清理缓存的方法 #DF
查看>>
JAVA array,map 转 json 字符串
查看>>
2017-12-27练习
查看>>
NET设计规范(二) 命名规范
查看>>
VMware 9.0.1安装Mac OS X Mountain Lion 10.8.2
查看>>
SSL延迟
查看>>
android新手关于左右滑动的问题,布局把<android.support.v4.view.ViewPager/><ImageView/> 放在上面就不行了。...
查看>>
深入理解DIP、IoC、DI以及IoC容器
查看>>
赋值文件
查看>>
Vue 数组 字典 template v-for 的使用
查看>>
蓝牙模块选择经验谈
查看>>
java中==和equals
查看>>
CCActionPageTurn3D
查看>>
python random
查看>>
esp32-智能语音-cli(调试交互命令)
查看>>
netty与MQ使用心得
查看>>
关于dl dt dd 文字过长换行在移动端显示对齐的探讨总结
查看>>
swoolefy PHP的异步、并行、高性能网络通信引擎内置了Http/WebSocket服务器端/客户端...
查看>>