• [Leetcode] 0836. 矩形重叠


    836. 矩形重叠

    English Version

    题目描述

    矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 为左下角的坐标,(x2, y2) 是右上角的坐标。矩形的上下边平行于 x 轴,左右边平行于 y 轴。

    如果相交的面积为 ,则称两矩形重叠。需要明确的是,只在角或边接触的两个矩形不构成重叠。

    给出两个矩形 rec1rec2 。如果它们重叠,返回 true;否则,返回 false

    示例 1:

    1. 输入:rec1 = [0,0,2,2], rec2 = [1,1,3,3]
    2. 输出:true

    示例 2:

    1. 输入:rec1 = [0,0,1,1], rec2 = [1,0,2,1]
    2. 输出:false

    示例 3:

    1. 输入:rec1 = [0,0,1,1], rec2 = [2,2,3,3]
    2. 输出:false

    提示:

    • rect1.length == 4
    • rect2.length == 4
    • -109 <= rec1[i], rec2[i] <= 109
    • rec1rec2 表示一个面积不为零的有效矩形

    解法

    方法一:判断不重叠的情况

    我们记矩形 rec1" role="presentation" style="position: relative;">rec1坐标点(x1,y1,x2,y2)" role="presentation" style="position: relative;">(x1,y1,x2,y2),矩形 rec2" role="presentation" style="position: relative;">rec2 的坐标点为 (x3,y3,x4,y4)" role="presentation" style="position: relative;">(x3,y3,x4,y4)

    那么当满足以下任一条件时,矩形 rec1" role="presentation" style="position: relative;">rec1rec2" role="presentation" style="position: relative;">rec2 不重叠:

    • 满足 y3y2" role="presentation" style="position: relative;">y3y2,即 rec2" role="presentation" style="position: relative;">rec2rec1" role="presentation" style="position: relative;">rec1 的上方;
    • 满足 y4y1" role="presentation" style="position: relative;">y4y1,即 rec2" role="presentation" style="position: relative;">rec2rec1" role="presentation" style="position: relative;">rec1 的下方;
    • 满足 x3x2" role="presentation" style="position: relative;">x3x2,即 rec2" role="presentation" style="position: relative;">rec2rec1" role="presentation" style="position: relative;">rec1 的右方;
    • 满足 x4x1" role="presentation" style="position: relative;">x4x1,即 rec2" role="presentation" style="position: relative;">rec2rec1" role="presentation" style="position: relative;">rec1 的左方。

    当以上条件都不满足时,矩形 rec1" role="presentation" style="position: relative;">rec1rec2" role="presentation" style="position: relative;">rec2 重叠。

    时间复杂度 O(1)" role="presentation" style="position: relative;">O(1)空间复杂度 O(1)" role="presentation" style="position: relative;">O(1)

    方法二:检查区域

    如果两个矩形重叠,那么它们重叠的区域一定也是一个矩形,那么这代表了两个矩形与 x" role="presentation" style="position: relative;">x 轴平行的边(水平边)投影到 x" role="presentation" style="position: relative;">x 轴上时会有交集,与 y" role="presentation" style="position: relative;">y 轴平行的边(竖直边)投影到 y" role="presentation" style="position: relative;">y 轴上时也会有交集。因此,我们可以将问题看作一维线段是否有交集的问题。

    矩形 rec1 和 rec2 的水平边投影到 x" role="presentation" style="position: relative;">x 轴上的线段分别为 (rec1[0], rec1[2]) 和 (rec2[0], rec2[2])。根据数学知识我们可以知道,当 min(rec1[2], rec2[2]) > max(rec1[0], rec2[0]) 时,这两条线段有交集。对于矩形 rec1 和 rec2 的竖直边投影到 yyy 轴上的线段,同理可以得到,当 min(rec1[3], rec2[3]) > max(rec1[1], rec2[1]) 时,这两条线段有交集。

    时间复杂度:O(1)" role="presentation" style="position: relative;">O(1)。空间复杂度:O(1)" role="presentation" style="position: relative;">O(1),不需要额外的空间。

    Python3

    方法一:

    1. class Solution:
    2. def isRectangleOverlap(self, rec1: List[int], rec2: List[int]) -> bool:
    3. x1, y1, x2, y2 = rec1
    4. x3, y3, x4, y4 = rec2
    5. return not (y3 >= y2 or y4 <= y1 or x3 >= x2 or x4 <= x1)

    方法二:

    1. class Solution:
    2. def isRectangleOverlap(self, rec1: List[int], rec2: List[int]) -> bool:
    3. def intersect(p_left, p_right, q_left, q_right):
    4. return min(p_right, q_right) > max(p_left, q_left)
    5. return (intersect(rec1[0], rec1[2], rec2[0], rec2[2]) and
    6. intersect(rec1[1], rec1[3], rec2[1], rec2[3]))

    C++

    方法一:

    1. class Solution {
    2. public:
    3. bool isRectangleOverlap(vector<int>& rec1, vector<int>& rec2) {
    4. int x1 = rec1[0], y1 = rec1[1], x2 = rec1[2], y2 = rec1[3];
    5. int x3 = rec2[0], y3 = rec2[1], x4 = rec2[2], y4 = rec2[3];
    6. return !(y3 >= y2 || y4 <= y1 || x3 >= x2 || x4 <= x1);
    7. }
    8. };

    方法二:

    1. class Solution {
    2. public:
    3. bool isRectangleOverlap(vector<int>& rec1, vector<int>& rec2) {
    4. return (min(rec1[2], rec2[2]) > max(rec1[0], rec2[0]) &&
    5. min(rec1[3], rec2[3]) > max(rec1[1], rec2[1]));
    6. }
    7. };
  • 相关阅读:
    数据结构(2-5~2-8)
    saas系统:巧用MyBatisPlus,成功实现多租户功能
    增减网络20220101
    家庭安全不容小觑!青犀AI智能分析算法+摄像头助力家庭安全
    11.17 - 每日一题 - 408
    (D卷,100分)- 最富裕的小家庭(Java & JS & Python & C)
    计算机网络_04_传输层
    我国智慧燃气建设应用过程中,有哪些关键问题?
    前端·在线随机生成图片 & 免费 API
    AI副业赚钱变现项目 做高清历史老照片单月变现5W+(攻略+提示词)
  • 原文地址:https://blog.csdn.net/yegeli/article/details/134384123