矩形以列表 [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]));
}
};