题目描述
矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标。
如果相交的面积为正,则称两矩形重叠。需要明确的是,只在角或边接触的两个矩形不构成重叠。
给出两个矩形,判断它们是否重叠并返回结果。
示例 1:
输入:rec1 = [0,0,2,2], rec2 = [1,1,3,3]
输出:true
示例 2:
输入:rec1 = [0,0,1,1], rec2 = [1,0,2,1]
输出:false
题目分析
思路一(复杂 Java实现):
判断一个点在不在矩形里很容易实现:点的x坐标在x1,x2之间,y坐标在y1,y2之间
1.重叠可能有一个矩形的顶点在另一个矩形里
判断两组八个点(判断四个也行,特殊情况留给下一个判断)
2.但是可能两个一般大(日字形/或者一个7)
反正就可以用四个边的中点去判断!逃不掉的中点判断!
判断八次,一定有一个边的中点在另一个矩形里。
over
思路二 (简单 C++实现)
去除两个矩形不相交的情况 剩下的情况都为相交
不相交的情况有四种:
矩形A下边界大于矩形B上边界
矩形A上边界小于矩形B下边界
矩形A左边界大于矩形B右边界
矩形A右边界小于矩形B左边界
因边界接触不表示覆盖,又要去掉边界接触的情况
所以以上几种情况再加上相等
这些情况返回false 剩下的返回true
代码
Java:
class Solution {
public boolean isRectangleOverlap(int[] rec1, int[] rec2) {
//判断四个顶点
if(isin(rec1[0],rec1[1],rec2)) return true;
if(isin(rec1[2],rec1[3],rec2)) return true;
if(isin(rec1[0],rec1[3],rec2)) return true;//另外两个顶点
if(isin(rec1[1],rec1[2],rec2)) return true;
//判断四个中点
int[][] recmiddle1 = {{(rec1[0]+rec1[2])/2,rec1[1]},{(rec1[0]+rec1[2])/2,rec1[3]},{rec1[0],(rec1[1]+rec1[3])/2},{rec1[2],(rec1[1]+rec1[3])/2}};
int[][] recmiddle2 = {{(rec2[0]+rec2[2])/2,rec2[1]},{(rec2[0]+rec2[2])/2,rec2[3]},{rec2[0],(rec2[1]+rec2[3])/2},{rec2[2],(rec2[1]+rec2[3])/2}};
int i = 0;
while(i<4)
{
if(isin(recmiddle1[i][0],recmiddle1[i][1],rec2)) return true;
++i;
}
i = 0;
while(i<4)
{
if(isin(recmiddle2[i][0],recmiddle2[i][1],rec1)) return true;
++i;
}
return false;
}
//判断一个点在不在一个矩形里
public boolean isin(int x ,int y, int[] rec)
{
if(x>rec[0]&&x<rec[2]&&y>rec[1]&&y<rec[3])
return true;
else
return false;
}
}
C++:(男朋友写的
class Solution {
public:
bool isRectangleOverlap(vector<int>& rec1, vector<int>& rec2) {
if(rec1[0] >= rec2[2] || rec1[2] <= rec2[0] || rec1[1] >= rec2[3] || rec1[3] <= rec2[1])
return false;
else
return true;
}
};