【leetcode】836. 矩形重叠(rectangle-overlap)(计算几何)[简单]

2023-05-16

链接

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>y4y2<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;
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【leetcode】836. 矩形重叠(rectangle-overlap)(计算几何)[简单] 的相关文章

随机推荐