链接
https://leetcode-cn.com/problems/rectangle-overlap/
耗时
解题:1 h+
题解:54 min
题意
给出两个正放的矩形的左下角和右上角的坐标,问两个矩形是否相交,但只在角或边接触的两个矩形不算。
思路
设第一个矩形左下角的坐标为(x1,y1),右上角的坐标为(x2,y2),第二个矩形左下角的坐标为(x3,y3),右上角的坐标为(x4,y4),如下图所示。若两正放的矩形相交,则必然其中一个矩形的竖边在另一个矩形的两个竖边之间,即例如rec1的x1或x2在 (x3,x4) 之间(具体来说,
x
1
∈
[
x
3
,
x
4
)
,
x
2
∈
(
x
3
,
x
4
]
x1\in[x3,x4), x2\in(x3,x4]
x1∈[x3,x4),x2∈(x3,x4],因为若x1=x4 or x2=x3,则是两个矩形只有边或角接触的),若已有rec1的一个竖边在rec2的两个竖边之间,那么除了rec1的上边低于rec2的下边或者rec1的下边高于rec2的上边都是相交的,即
!
(
y
1
>
y
4
∣
∣
y
2
<
y
3
)
!(y1 > y4 || y2 < y3)
!(y1>y4∣∣y2<y3)即可认为两矩形相交。而对于 rec2 的某一个竖边在 rec1 的两个竖边之间的情况同理可得。除此之外,其余情况均不可能相交。
AC代码
class Solution {
public:
bool isRectangleOverlap(vector<int>& rec1, vector<int>& rec2) {
int x1 = rec1[0];
int y1 = rec1[1];
int x2 = rec1[2];
int y2 = rec1[3];
int x3 = rec2[0];
int y3 = rec2[1];
int x4 = rec2[2];
int y4 = rec2[3];
if((x1 >= x3 && x1 < x4) || (x2 > x3 && x2 <= x4)) {
if(!(y1 > y4 || y2 < y3)) return true;
}
if((x3 >= x1 && x3 < x2) || (x4 > x1 && x4 <= x2)) {
if(!(y3 > y2 || y4 < y1)) return true;
}
return false;
}
};