每日一題,每日一練.3矩形重疊

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:
    def isRectangleOverlap(self, rec1: List[int], rec2: List[int]) -> bool:
        return(False if rec1[2]<=rec2[0] or rec1[0]>=rec2[2] or maxrec1[3]<=rec2[1] or rec1[1]>=rec2[3]) else True)
```python
(順邊練了儘量寫在同一行裏的三元表達式)

在這裏插入圖片描述不出意外的內存炸了==,可是好像改進不了,又浪費一小時,最後偷偷去看官方的題解,有第二種投影法,是基於假設有重疊部分的時候,兩個矩形在x軸上的邊有交集,在y軸上的邊也有交集,於是就有了第二種方法。

class Solution(object):
    def isRectangleOverlap(self, rec1, rec2):
        def intersect(p_left, p_right, q_left, q_right):
            return min(p_right, q_right) > max(p_left, q_left)
        return (intersect(rec1[0], rec1[2], rec2[0], rec2[2]) and
                intersect(rec1[1], rec1[3], rec2[1], rec2[3]))

然而對於效率沒什麼改進,不過多一種方法總是好事,生活大抵也是如此

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章