day5 (836. 矩形重疊)

  • 題目描述:
    矩形以列表 [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;
    }
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章