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

链接

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=x4 or x2=x3,则是两个矩形只有边或角接触的),若已有rec1的一个竖边在rec2的两个竖边之间,那么除了rec1的上边低于rec2的下边或者rec1的下边高于rec2的上边都是相交的,即 ! ( y 1 > y 4 y 2 < y 3 ) !(y1 > y4 || y2 < 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;
    }
};
发布了76 篇原创文章 · 获赞 20 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Krone_/article/details/104951136