矩形以列表[x1,y1,x2,y2]
的形式表示,其中(x1,y1)
是左下角的坐标,(x2,y2)
是右上角的坐标。
如果相交的面积为正,则称两矩形重叠。需要明确的是,只在角或边接触的两个矩形不构成重叠。
给出两个矩形,判断它们是否重叠并返回结果。
示例1:
Input :rec1 = [0,0,2,2], rec2 = [1,1,3,3]
Output:true
示例 2:
Input :rec1 = [0,0,1,1], rec2 = [1,0,2,1]
Output:false
说明:
两个矩形 rec1
和 rec2
都以含有四个整数的列表的形式给出。
矩形中的所有坐标都处于 -10^9
和 10^9
之间。
分析:
假设两个矩形的四个顶点的坐标分别如图所示:
分析两个矩形重叠的情况比较复杂,那么就转而分析两个矩形不重叠的临界条件。两个矩形有四种不重叠情况。
情况1:
此时两个矩形的位置关系是:x2 = a1
y2 = b1
两个矩形刚好不重叠。如果绿色矩形向左下方移动,两个矩形就会发生重叠,即重叠时两个矩形的位置关系为x2 > a1
y2 > b1
。
另外三种情况分别如下图所示:
按照在情况1中的分析方法,得到这三种情况下,重叠时的矩形位置关系分别为:
x2 > a1
,y1 < b2
x1 < a2
,y2 > b1
x1 < a2
,y1 < b2
在结合情况1,对四种情况进行综合,得到最终的矩形重叠时满足的位置关系为:
x1 < a2
,y1 < b2
,x2 > a1
,y2 > b1
。
相应的代码为:
class Solution {
public:
bool isRectangleOverlap(vector<int>& rec1, vector<int>& rec2) {
return (rec1[0] < rec2[2]) && (rec1[1] < rec2[3])
&& (rec1[2] > rec2[0]) && (rec1[3] > rec2[1]);
}
};
运行情况: