判断两个矩形是否相交矩形正方形坐标(LeetCode算法第836)
题目:判断两个矩形是否相交
题目描述:
给定两个矩形,判断这两个矩形是否相交。每个矩形由其左下角的点和右上角的点预示。
例如,矩形1的左下角为[0,0],右上角为[2,2];矩形2的左下角为[1,1],右上角为[3,3]。这两个矩形相交。
处理方案:
要判断两个矩形是否相交,可Yi经过比较两个矩形的具体位置关系来核实确定。
假如两个矩形不相交,那么可以通过以下几类情况判断:
情况一:矩形1在矩形2的左边或右边,即矩形1的右上角在矩形2的左下角左边或矩形1的左下角在矩形2的右上角右边。
情况二:矩形1在矩形2的上边或下边,即矩形1的右上角在矩形2的左下角上边或矩形1的左下角在矩形2的右上角下边。
情况三:矩形1在矩形2的对角线上,即矩形1的右上角在矩形2的左下角或矩形1的左下角在矩形2的右上角。
依据上述情况,假如满足以上任意一种情况,那么可以判断两个矩形不相交。
假如两个矩形相交,可Yi经过以下几类情况判断:
情况一:矩形1在矩形2的内部,即矩形1的左下角在矩形2的左上角和右下角之间,且矩形1的右上角在矩形2的左上角和右下角之间。
情况二:矩形2在矩形1的内部,即矩形2的左下角在矩形1的左上角和右下角之间,且矩形2的右上角在矩形1的左上角和右下角之间。
情况三:矩形1和矩形2相互包围,即矩形1的左下角在矩形2的左上角和右下角之间,且矩形1的右上角在矩形2的左下角和右上角之间,或者矩形2的左下角在矩形1的左上角和右下角之间,且矩形2的右上角在矩形1的左下角和右上角之间。
依据上述情况,假如满足以上任意一种情况,那么可以判断两个矩形相交。
总的来说,咱们能够通过逐个比较矩形之角落坐标来推测断定两个矩形是否相交。
算法实现:
可以定义一个函数intersectRectangle来实现以上的算法逻辑。具体实现如下:
```
publicbooleanintersectRectangle(int[]rect1,int[]rect2){
intx1=rect1[0];//矩形1的左下角x坐标
inty1=rect1⓵;//矩形1的左下角y坐标
intx2=rect1⓶;//矩形1的右上角x坐标
inty2=rect1⓷;//矩形1的右上角y坐标
intx3=rect2[0];//矩形2的左下角x坐标
inty3=rect2⓵;//矩形2的左下角y坐标
intx4=rect2⓶;//矩形2的右上角x坐标
inty4=rect2⓷;//矩形2的右上角y坐标
//判断两个矩形是否相交
return(x1=x3&&y1=y3)||(x3=x1&&y3=y1);
}
```
示例:
```
int[]rect1={0,0,2,2};
int[]rect2={1,1,3,3};
System。out。println(intersectRectangle(rect1,rect2));//输出:true
```
上面便是判断两个矩形是否相交的处理方案和算法实现。
来源头条作者:吾是我师技术提高是一个循序渐进的过程,因此我讲的leetcode算法题从最简单容易的level开始写的,紧接着>到中级难度,最后到hard难度全部完。目前我选择C语言,Python和Java作为实现语言,由于这3种语言还是比较典型的。因为篇幅和>精力有限,其他语言的实现感兴趣的friend请自己try。初级难度说的差不多的时刻,我打算再加点其他内容,我也许会从操作系统到协议栈,从分布式>聊到大数据框架,从大数据聊到人工智能,。。。。。。。假如有任何问题能在文章后评论或者私信给我。俺会持续共享下去,敬请您的注意和关注。
LeetCode836、矩形重叠(RectangleOverlap)问题描述:
矩形以列表[x1,y1,x2,y2]的形式预示,其中(x1,y1)为左下角的坐标,(x2,y2)是右上角的坐标。假如相交的面积为正,则称两矩形重叠。需要确定的是,只在角或边接触的两个矩形不构成重叠。给出两个矩形,判断它们是否重叠并返回结果。
注:两个矩形rec1和rec2都以含有四个整数的列表的形式给出。矩形中的所有坐标都处于-10^9和10^9之间。示例:C语言实现:
解题的重点是找到怎样确定两个正方形相交。
两个正方形相交有许多形式,我们看下面两种典型的形式:
先看左图,蓝色和绿色的正方形相交。注意和提防观察它们x坐标的情形,会总结出:
x4-x1
假如y坐标也满足:y1+y4
再看右图的x坐标,这一时刻:
x2-x3
而y坐标仍然是:y1-y4
我们会发现假如用这一个方法来解题,大家需要考虑所有相交的情况,紧接着一一作出判断。
这一个方法有些麻烦。有还是没有一种方法仅需要少量的判断的方式方法。答案是有的。
依然从左图说起。
我们假设蓝色正方形是固定不动的,而绿色正方形从右边远处向蓝色正方形移动。那么这样说的话在最开始的时刻两个正方形是不相交的,总之存在:x10;而当移动到两个正方形相交的时刻,存在:x1假如绿色正方形继续向左移动,最后出此刻蓝色正方形的左边,且还与蓝色正方形相交时,就是右图的形式,则存在:x3假如继续移动,两个正方形不再相交,则存在:x30;
总之,假如两个正方形相交,则存在(x4-x1)*(x3-x2)
同理你可以对y坐标做类似的剖析,可以总结出,假如两个正方形相交,则存在(y4-y1)*(y3-y2)
因此我们可以 使用下面表达式的值来推测断定两个正方形是否相交:
(x4-x1)*(x3-x2)
如下代码如下:
注意和提防x坐标和y坐标在rec1和rec2中的具体位置和顺序。
对于C和JAVA要慎重考虑数值溢出的问题,因此要对以上的表达式做强制类型转换。Java语言实现:
Java的实现和C语言的实现一致,不再撰述。代码如下:Python语言实现:
Python的实现和C语言的实现一致,不再撰述。代码如下: