矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标。
如果相交的面积为正,则称两矩形重叠。需要明确的是,只在角或边接触的两个矩形不构成重叠。
给出两个矩形,判断它们是否重叠并返回结果。
示例一
输入:rec1 = [0,0,2,2], rec2 = [1,1,3,3]
输出:true
示例二
输入:rec1 = [0,0,1,1], rec2 = [1,0,2,1]
输出:false
解题思路:
正向思考:分为三种情况:
1、矩形一的拐角落在矩形二中
2、矩形二的拐角落在矩形一中
3、不存在落拐角的矩形重合
实现代码:
int isRectangleOverlap(int* rec1, int rec1Size, int* rec2, int rec2Size){
//判断点在内的情况
if (
(
((rec2[0]>rec1[0] && rec2[0] < rec1[2])
|| (rec2[2] > rec1[0] && rec2[2]<rec1[2]))
&&((rec2[1] > rec1[1] && rec2[1]<rec1[3])
|| (rec2[3]>rec1[1] && rec2[3] < rec1[3]))
)
||
(
((rec1[0] > rec2[0] && rec1[0]<rec2[2])
|| (rec1[2]>rec2[0] && rec1[2] < rec2[2]))
&&
((rec1[1] > rec2[1] && rec1[1]<rec2[3])
|| (rec1[3]>rec2[1] && rec1[3] < rec2[3]))
)
||
(((rec1[0] >= rec2[0] && rec1[2] <= rec2[2])
&& (rec1[1] <= rec2[1] && rec1[3] >= rec2[3]))
||
((rec2[0] >= rec1[0] && rec2[2] <= rec1[2]
&& (rec2[1] <= rec1[1] && rec2[3] >= rec1[3])))
)) {
return true;
}
return false;
}
解法二:逆向思维
列举所有的不重叠情况:
实现代码:
if (rec2[0]>=rec1[2] || rec1[0]>=rec2[2] || rec2[3]<=rec1[1] || rec1[3] <=rec2[1] ) {
return false;
}
return true;
结果:
事实证明:逆向思维很重要…