矩陣重疊(Java實現)

矩陣重疊(Java實現)

題目:
矩形以列表 [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 軸默認指向上。
你可以僅考慮矩形是正放的情況。

我的解法是:窮舉法,把所有的情況都考慮在內,寫了蠻久的,考慮的情況好多~

package Day45;

/**
 * @Author Zhongger
 * @Description 矩形以列表 [x1, y1, x2, y2] 的形式表示,其中 (x1, y1) 爲左下角的座標,(x2, y2) 是右上角的座標。
 * 如果相交的面積爲正,則稱兩矩形重疊。需要明確的是,只在角或邊接觸的兩個矩形不構成重疊。
 * 給出兩個矩形,判斷它們是否重疊並返回結果。
 * @Date  2020.3.18
 */
public class IsRectangleOverlapSolution {

    public boolean isRectangleOverlap(int[] rec1, int[] rec2) {
        int ax1=rec1[0],ay1=rec1[1],ax2=rec1[2],ay2=rec1[3]; //第一個矩形
        int bx1=rec2[0],by1=rec2[1],bx2=rec2[2],by2=rec2[3]; //第二個矩形
        if (bx1<=ax1&&by1<=ay1){
            if (bx2>ax1&&by2>ay1){
                return true;
            }else {
                return false;
            }
        }
        if (bx1<=ax1&&by1>ay1&&by1<ay2){
            if (by2>by1&&by2>ay1&&bx2>ax1){
                return true;
            }else {
                return false;
            }
        }
        if (bx1<=ax1&&by1>ay1) {
            return false;
        }
        if (bx1>ax1&&bx1<ax2&&by1<ay1){
            if (bx2>bx1&&by2>=ay1){
                return true;
            }else {
                return false;
            }

        }
        if (bx1>ax1&&bx1<ax2&&by1>ay1&&by2<ay2){
            return true;
        }
        if (bx1>ax1&&bx1<ax2&&by1>=ay2){
            return false;
        }
        if (bx1>=ax2){
            return false;
        }

        return true;
    }

}

一次提交就AC了,紀念一下。
在這裏插入圖片描述

下面看看大神的解法:
矩形重疊是二維的問題,所以情況很多,比較複雜。爲了簡化問題,我們可以考慮將二維問題轉化爲一維問題。既然題目中的矩形都是平行於座標軸的,我們將矩形投影到座標軸上:

project-overlap

矩形投影到座標軸上,就變成了區間。稍加思考,我們發現:兩個互相重疊的矩形,它們在 xx 軸和 yy 軸上投影出的區間也是互相重疊的。這樣,我們就將矩形重疊問題轉化成了區間重疊問題。

區間重疊是一維的問題,比二維問題簡單很多。我們可以窮舉出兩個區間所有可能的 6 種關係:

interval-relation

可以看到,區間的 6 種關係中,不重疊只有兩種情況,判斷不重疊更簡單。假設兩個區間分別是 [s1, e1] 和 [s2, e2] 的話,區間不重疊的兩種情況就是 e1 <= s2 和 e2 <= s1。

interval-overlap

我們就得到區間不重疊的條件: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章