-
題目描述:
矩形以列表 [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 軸默認指向上。
你可以僅考慮矩形是正放的情況。 -
我的題解
class Solution { public boolean isRectangleOverlap(int[] rec1, int[] rec2) { if(rec2[0] >= rec1[2] || rec2[1] >= rec1[3] ||rec1[0] >= rec2[2] ||rec1[1] >= rec2[3] ) { return false; } return true; } }
-
運行結果:
題目來源:https://leetcode-cn.com/problems/rectangle-overlap/ -
問題總結(轉載自:https://leetcode-cn.com/problems/rectangle-overlap/solution/tu-jie-jiang-ju-xing-zhong-die-wen-ti-zhuan-hua-we/)
矩形重疊要考慮的情況很多,兩個矩形的重疊可能有好多種不同的形態。這道題如果用蠻力做的話,很容易遺漏掉某些情況,導致出錯。
矩形重疊是二維的問題,所以情況很多,比較複雜。爲了簡化問題,我們可以考慮將二維問題轉化爲一維問題。既然題目中的矩形都是平行於座標軸的,我們將矩形投影到座標軸上:
矩形投影到座標軸上,就變成了區間。稍加思考,我們發現:兩個互相重疊的矩形,它們在 xx 軸和 yy 軸上投影出的區間也是互相重疊的。這樣,我們就將矩形重疊問題轉化成了區間重疊問題。
區間重疊是一維的問題,比二維問題簡單很多。我們可以窮舉出兩個區間所有可能的 6 種關係:
可以看到,區間的 6 種關係中,不重疊只有兩種情況,判斷不重疊更簡單。假設兩個區間分別是 [s1, e1] 和 [s2, e2] 的話,區間不重疊的兩種情況就是 e1 <= s2 和 e2 <= s1。
我們就得到區間不重疊的條件:e1 <= s2 || e2 <= s1。將條件取反即爲區間重疊的條件。
public boolean isRectangleOverlap(int[] rec1, int[] rec2) { boolean x_overlap = !(rec1[2] <= rec2[0] || rec2[2] <= rec1[0]); boolean y_overlap = !(rec1[3] <= rec2[1] || rec2[3] <= rec1[1]); return x_overlap && y_overlap; }
day5 (836. 矩形重疊)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.