↓快轉到主要內容
  1. LeetCode/

LeetCode 836: Rectangle Overlap

·1 分鐘· ·
LeetCode Easy Math Geometry
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: easy 第一次嘗試:2022-09-15

  • 提交紀錄:Wrong Answer → Runtime Error → Wrong Answer ×4 → Runtime Error ×2 → Wrong Answer ×4 → Accepted

解題思路
#

二維的重疊可以拆成兩個一維的區間重疊(Math 模板三):交集的寬度是 min(x2) - max(x1)、高度是 min(y2) - max(y1),兩者都要大於 0(剛好碰到邊不算重疊)。不用分「誰在誰左邊」的各種情況。

我的嘗試
#

這題提交了 13 次,前面十二次都在用「某個端點落在另一個矩形的範圍內」分情況討論,每次都漏掉一種:

  • 只檢查 rec2 的起點在 rec1 的終點之前:[1, 2, 3, 4] 和 [2, 1, 4, 2] 在 y = 2 只碰到邊,回傳 True。
  • 只檢查 y 方向、或用嚴格不等式:兩個矩形 y 範圍完全相同時([1, 0, 4, 2]、[3, 0, 4, 2])回傳 False。
  • x、y 都檢查「端點在區間裡」之後,一個矩形包住另一個的情況又漏了:[3, 3, 4, 4] 在 [3, 2, 6, 5] 裡面,回傳 False。

最後改成算交集的寬和高才 AC。

正確解法
#

class Solution:
    def isRectangleOverlap(self, rec1: List[int], rec2: List[int]) -> bool:
        width = min(rec1[2], rec2[2]) - max(rec1[0], rec2[0])
        height = min(rec1[3], rec2[3]) - max(rec1[1], rec2[1])
        return width > 0 and height > 0

複雜度
#

時間 O(1),空間 O(1)。

要特別避免的錯誤
#

  • x 和 y 兩個方向都要檢查。
  • 用嚴格大於,只碰到邊不算。
  • 一個矩形完全包住另一個時,兩個端點都不在對方的範圍內,用「端點落在區間裡」來判斷會漏掉。

面試口說整理
#

我把重疊拆成 x 和 y 兩個方向的區間重疊,交集寬度是兩個右邊界的較小值減兩個左邊界的較大值,高度同理,兩者都大於 0 才算重疊。時間 O(1)。

相關文章

LeetCode 812: Largest Triangle Area
·1 分鐘
LeetCode Easy Array Math Geometry Polygons
LeetCode 812 解題筆記:點最多 50 個,枚舉所有三點組合,用鞋帶公式算面積取最大
LeetCode 728: Self Dividing Numbers
·1 分鐘
LeetCode Easy Math
LeetCode 728 解題筆記:逐一檢查範圍內的每個數,每一位都不能是 0 而且要能整除這個數
LeetCode 628: Maximum Product of Three Numbers
·1 分鐘
LeetCode Easy Array Math Sorting
LeetCode 628 解題筆記:排序後答案只有兩種可能:最大的三個相乘,或最小的兩個(負數)乘最大的一個
LeetCode 598: Range Addition II
·1 分鐘
LeetCode Easy Array Math
LeetCode 598 解題筆記:每次操作都包含左上角,被加最多次的是所有操作的交集:min(a) × min(b)
LeetCode 504: Base 7
·1 分鐘
LeetCode Easy Math String
LeetCode 504 解題筆記:對絕對值不斷取 % 7 和 // 7,最後加上負號並反轉;0 要特別處理
LeetCode 509: Fibonacci Number
·1 分鐘
LeetCode Easy Math Dynamic-Programming Recursion Memoization
LeetCode 509 解題筆記:一維 DP 的起點:只需要前兩項,用兩個變數滾動