leetcode836. 矩形重疊

矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 爲左下角的座標,(x2, y2) 是右上角的座標。

如果相交的面積爲正,則稱兩矩形重疊。需要明確的是,只在角或邊接觸的兩個矩形不構成重疊。

給出兩個矩形,判斷它們是否重疊並返回結果。

示例 1:

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

示例 2:

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

提示:

  • 兩個矩形 rec1 和 rec2 都以含有四個整數的列表的形式給出。
  • 矩形中的所有座標都處於 -10^9 和 10^9 之間。
  • x 軸默認指向右,y 軸默認指向上。
  • 你可以僅考慮矩形是正放的情況。

完整代碼

基本思想:
按矩形的邊進行判斷,重合時,必定有一個矩形的至少兩條邊過另一個矩形內
分兩種情況考慮:矩形1的邊在矩形2內,矩形2的邊在矩形1內。

class Solution {
public:
    bool isRectangleOverlap(vector<int>& rec1, vector<int>& rec2) {
        bool res = false;
        //矩形2的最右邊過矩形1,並且排除矩形2的下邊大於矩形1的上邊 和 矩形2的上邊小於矩形1的下邊
        res = res || (rec2[2] > rec1[0] && rec2[2] <= rec1[2] && (!(rec2[1] >= rec1[3] || rec2[3] <= rec1[1])));
        //矩形1的最右邊過矩形2,並且排除矩形1的下邊大於矩形2的上邊 和 矩形1的上邊小於矩形2的下邊
        res = res || (rec1[2] > rec2[0] && rec1[2] <= rec2[2] && (!(rec1[1] >= rec2[3] || rec1[3] <= rec2[1])));
        
        return res;
    }
};

基本思想:
兩矩形有重合的地方,重合的圖形也是矩形。
將問題轉化成判斷兩矩形分別在x軸和在y軸上的投影是否有交集。

  • 矩形一在x軸上的投影:(rec1[0],rec1[2])
  • 矩形二在x軸上的投影:(rec2[0],rec2[2])
  • 兩個投影區間有交集,需要滿足min(rec1[2], rec2[2]) > max(rec1[0], rec2[0])
  • 在y軸上也同樣的判斷方法
class Solution {
public:
    bool isRectangleOverlap(vector<int>& rec1, vector<int>& rec2) {
        return (min(rec1[2], rec2[2]) > max(rec1[0], rec2[0]) && 
            min(rec1[3], rec2[3]) > max(rec1[1], rec2[1]));
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章