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

LeetCode 1401: Circle and Rectangle Overlapping

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

基本資料
#

難易度: medium 第一次嘗試:2026-01-05

  • 提交紀錄:Wrong Answer ×3 → Accepted

解題思路
#

圓和矩形有交集 ⇔ 矩形裡離圓心最近的點在圓內。

最近的點很好找:x 和 y 各自獨立,把圓心的 x 夾到 [x1, x2]、y 夾到 [y1, y2]:

nx = min(max(xc, x1), x2)
ny = min(max(yc, y1), y2)

圓心在矩形裡時,最近點就是圓心本身,距離是 0,也會判斷成重疊。

比較距離時用平方,避免開根號的浮點誤差。

我的嘗試
#

我的寫法是分成四個方向(圓心在矩形的左、下、右、上),每個方向再判斷最近的點。四個 if 裡有兩次寫錯:

版本問題
第一版沒處理圓心在矩形內;最後一個方向(上方)寫成 yCenter < y2,應該是 yCenter > y2。例如半徑 2、圓心 (6, 4)、矩形 (5, 0)–(6, 2):上邊的 (6, 2) 距離剛好 2,答案是 True,回傳 False
第二版補上圓心在矩形內,上方的條件還是錯的,同一個例子回傳 False
第三版改成 <=,方向還是反的。例如半徑 3、圓心 (3, 4)、矩形 (2, 2)–(5, 3):答案是 True,回傳 False
AC改成 yCenter >= y2

clamp 的寫法不用分情況,就不會有方向寫反的問題。

正確解法
#

class Solution:
    def checkOverlap(self, radius: int, xCenter: int, yCenter: int, x1: int, y1: int, x2: int, y2: int) -> bool:
        nx = min(max(xCenter, x1), x2)             # 矩形裡離圓心最近的點
        ny = min(max(yCenter, y1), y2)
        return (nx - xCenter) ** 2 + (ny - yCenter) ** 2 <= radius ** 2

複雜度
#

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

要特別避免的錯誤
#

  • 分情況討論時把比較的方向寫反。
  • 漏掉圓心在矩形內的情況。
  • 用浮點數開根號比較:用平方比較比較穩。

面試口說整理
#

我找矩形裡離圓心最近的點:x 和 y 各自把圓心的座標夾到矩形的範圍內,這個點到圓心的距離平方不超過半徑平方就重疊。圓心在矩形內時最近點就是圓心,也自然成立。時間 O(1)。

相關文章

LeetCode 973: K Closest Points to Origin
·1 分鐘
LeetCode Medium Array Math Divide-and-Conquer Geometry
LeetCode 973 解題筆記:跟 Top-K 一樣,用大小為 k 的 max-heap(存負的距離)保留最近的 k 個點
LeetCode 3648: Minimum Sensors to Cover Grid
·1 分鐘
LeetCode Medium Math
LeetCode 3648 解題筆記:每個感測器蓋住 (2k + 1) × (2k + 1) 的正方形,兩個方向各自做無條件進位的除法再相乘
LeetCode 3627: Maximum Median Sum of Subsequences of Size 3
·1 分鐘
LeetCode Medium Math Greedy Sorting Game-Theory Array
LeetCode 3627 解題筆記:排序後每次拿最大的兩個和最小的一個,中位數是第二大的;答案是從尾端往前每隔一個取,共 n / 3 個
LeetCode 1814: Count Nice Pairs in an Array
·1 分鐘
LeetCode Medium Array Hash-Table Math Counting
LeetCode 1814 解題筆記:把條件移項成 nums[i] - rev(nums[i]) == nums[j] - rev(nums[j]),按這個值分組數 pair,記得取模
LeetCode 313: Super Ugly Number
·1 分鐘
LeetCode Medium Array Math Dynamic-Programming
LeetCode 313 解題筆記:LC 264 的推廣,每個質數一個指針;用 heap 的話要避免同一個數被推進去很多次
LeetCode 396: Rotate Function
·1 分鐘
LeetCode Medium Array Math Dynamic-Programming
LeetCode 396 解題筆記:F(k) 和 F(k - 1) 只差一個公式:F(k) = F(k - 1) + sum - n × 被移到最前面的那個數