【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) 之間(具體來說,x1[x3,x4),x2(x3,x4]x1\in[x3,x4), x2\in(x3,x4],因爲若x1=x4 or x2=x3,則是兩個矩形只有邊或角接觸的),若已有rec1的一個豎邊在rec2的兩個豎邊之間,那麼除了rec1的上邊低於rec2的下邊或者rec1的下邊高於rec2的上邊都是相交的,即!(y1>y4y2<y3)!(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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章