Easy
题目描述
轴对齐的矩形用列表 [x1, y1, x2, y2] 表示,其中 (x1, y1) 是其左下角坐标,(x2, y2) 是其右上角坐标。矩形的上下边平行于 X 轴,左右边平行于 Y 轴。
当两个矩形的交集面积为正数时,它们重叠。需要明确的是,仅在角落或边缘接触的两个矩形不重叠。
给定两个轴对齐的矩形 rec1 和 rec2,如果它们重叠,返回 true;否则,返回 false。
示例 1:
输入:rec1 = [0,0,2,2], rec2 = [1,1,3,3]
输出:true
示例 2:
输入:rec1 = [0,0,1,1], rec2 = [1,0,2,1]
输出:false
示例 3:
输入:rec1 = [0,0,1,1], rec2 = [2,2,3,3]
输出:false
约束条件:
- rec1.length == 4
- rec2.length == 4
- -10^9 <= rec1[i], rec2[i] <= 10^9
- rec1 和 rec2 表示面积不为零的有效矩形
解题思路
判断两个矩形是否重叠有两种主要思路:
方法一:正向判断 直接判断两个矩形是否有重叠区域。两个矩形重叠的条件是:
- 在 X 轴方向有重叠:
max(x1_1, x1_2) < min(x2_1, x2_2) - 在 Y 轴方向有重叠:
max(y1_1, y1_2) < min(y2_1, y2_2)
只有当两个方向都有重叠时,矩形才真正重叠。
方法二:反向判断(推荐) 使用反向思维,判断两个矩形不重叠的情况,然后取反。两个矩形不重叠的情况包括:
- rec1 在 rec2 的左边:
rec1[2] <= rec2[0] - rec1 在 rec2 的右边:
rec1[0] >= rec2[2] - rec1 在 rec2 的下方:
rec1[3] <= rec2[1] - rec1 在 rec2 的上方:
rec1[1] >= rec2[3]
只要满足任一条件,两矩形就不重叠。反向判断的逻辑更清晰,代码更简洁。
代码实现
class Solution {
public:
bool isRectangleOverlap(vector<int>& rec1, vector<int>& rec2) {
return !(rec1[2] <= rec2[0] || // rec1 在 rec2 左边
rec1[0] >= rec2[2] || // rec1 在 rec2 右边
rec1[3] <= rec2[1] || // rec1 在 rec2 下方
rec1[1] >= rec2[3]); // rec1 在 rec2 上方
}
};
class Solution:
def isRectangleOverlap(self, rec1: List[int], rec2: List[int]) -> bool:
return not (rec1[2] <= rec2[0] or # rec1 在 rec2 左边
rec1[0] >= rec2[2] or # rec1 在 rec2 右边
rec1[3] <= rec2[1] or # rec1 在 rec2 下方
rec1[1] >= rec2[3]) # rec1 在 rec2 上方
public class Solution {
public bool IsRectangleOverlap(int[] rec1, int[] rec2) {
return !(rec1[2] <= rec2[0] || // rec1 在 rec2 左边
rec1[0] >= rec2[2] || // rec1 在 rec2 右边
rec1[3] <= rec2[1] || // rec1 在 rec2 下方
rec1[1] >= rec2[3]); // rec1 在 rec2 上方
}
}
var isRectangleOverlap = function(rec1, rec2) {
return !(rec1[2] <= rec2[0] || // rec1 在 rec2 左边
rec1[0] >= rec2[2] || // rec1 在 rec2 右边
rec1[3] <= rec2[1] || // rec1 在 rec2 下方
rec1[1] >= rec2[3]); // rec1 在 rec2 上方
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(1) | 只需要进行常数次比较操作 |
| 空间复杂度 | O(1) | 只使用常数级别的额外空间 |
相关题目
- . Rectangle Area (Medium)