题目描述
矩形以列表 [x1, y1, x2, y2]
的形式表示,其中 (x1, y1)
为左下角的坐标,(x2, y2)
是右上角的坐标。矩形的上下边平行于 x
轴,左右边平行于 y
轴。
如果相交的面积为 正,则称两矩形重叠。需要明确的是,只在角或边接触的两个矩形不构成重叠。
给出两个矩形 rec1
和 rec2
。如果它们重叠,返回 true
;否则,返回 false
。
样例
输入:rec1 = [0,0,2,2], rec2 = [1,1,3,3]
输出:true
输入:rec1 = [0,0,1,1], rec2 = [1,0,2,1]
输出:false
输入:rec1 = [0,0,1,1], rec2 = [2,2,3,3]
输出:false
限制
rect1.length == 4
rect2.length == 4
-10^9 <= rec1[i], rec2[i] <= 10^9
rec1[0] <= rec1[2]
且rec1[1] <= rec1[3]
rec2[0] <= rec2[2]
且rec2[1] <= rec2[3]
算法
(模拟) $O(1)$
- 二维矩阵的重叠判断可以看成两个一维线段重叠的判断。
- 对于一维的问题,假设线段两个端点以
[l1, r1]
和[l2, r2]
给出,则重叠的充要条件为l1 < r2 and l2 < r1
。 - 注意如果矩形退化成线段或点,直接返回
false
。
时间复杂度
- 两个判断,时间复杂度为 $O(1)$。
空间复杂度
- 同理,为 $O(1)$。
C++ 代码
class Solution {
public:
bool isRectangleOverlap(vector<int>& rec1, vector<int>& rec2) {
if (rec1[0] == rec1[2] || rec1[1] == rec1[3])
return false;
if (rec2[0] == rec2[2] || rec2[1] == rec2[3])
return false;
return rec1[0] < rec2[2] && rec2[0] < rec1[2]
&& rec1[1] < rec2[3] && rec2[1] < rec1[3];
}
};
数据更新了,要先判断是否可以构成矩形再判断是否重叠
已修正~
思路分析应该是l2<r1吧
手误,已修正