2026年9月19日 星期六

LeetCode 解題筆記:1401. Circle and Rectangle Overlapping

作者:王一哲
日期:2026年9月19日


LeetCode 題目連結:1401. Circle and Rectangle Overlapping

解題想法


中等難度題,題目給一個圓的圓心坐標 $(xCenter, yCenter)$ 及半徑 $radius$,一個長方形的左下角頂點坐標 $(x1, y1)$,右上角頂點坐標 $(x2, y2)$,回傳這個圓形與長方形是否重疊,只要邊緣接觸到就當作重疊。這題的下方有提示,計算圓心與長方形最接近的點之間的距離,再判斷距離是否小於等於半徑,基本上按照這個提示寫程式就能過關。另外有一個狀況要記得考慮,圓心可能在長方形之中,這樣也是重疊,要回傳 True。

Python 程式碼


Runtime: 0 ms, beats 100.00%. Memory: 19.18 MB, beats 100.00%.
class Solution:
    def checkOverlap(self, radius: int, xCenter: int, yCenter: int, x1: int, y1: int, x2: int, y2: int) -> bool:
        d = 0
        # 如果圓心在長方形內
        if x1 <= xCenter <= x2 and y1 <= yCenter <= y2:
            return True
        # 如果圓心在長方形左上角
        elif xCenter <= x1 and yCenter >= y2:
            d = (xCenter - x1)**2 + (yCenter - y2)**2
        # 如果圓心在長方形左下角
        elif xCenter <= x1 and yCenter <= y1:
            d = (xCenter - x1)**2 + (yCenter - y1)**2
        # 如果圓心在長方形左側
        elif xCenter <= x1 and y1 < yCenter < y2:
            d = (xCenter - x1)**2
        # 如果圓心在長方形右上角
        elif xCenter >= x2 and yCenter >= y2:
            d = (xCenter - x2)**2 + (yCenter - y2)**2
        # 如果圓心在長方形右下角
        elif xCenter >= x2 and yCenter <= y1:
            d = (xCenter - x2)**2 + (yCenter - y1)**2
        # 如果圓心在長方形右側
        elif xCenter >= x2:
            d = (xCenter - x2)**2
        # 如果圓心在長方形上方
        elif yCenter >= y2:
            d = (yCenter - y2)**2
        # 如果圓心在長方形下方
        elif yCenter <= y1:
            d = (yCenter - y1)**2
        return d <= radius**2


C++ 程式碼


Runtime: 0 ms, beats 100.00%. Memory: 7.77 MB, beats 68.85%.
class Solution {
public:
    bool checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {
        int d;
        // 如果圓心在長方形內
        if (xCenter >= x1 && xCenter <= x2 && yCenter >= y1 && yCenter <= y2) {
            return true;
        } else if (xCenter <= x1 && yCenter >= y2) {
            // 如果圓心在長方形左上角
            d = (xCenter - x1)*(xCenter - x1) + (yCenter - y2)*(yCenter - y2);
        } else if (xCenter <= x1 && yCenter <= y1) {
            // 如果圓心在長方形左下角
            d = (xCenter - x1)*(xCenter - x1) + (yCenter - y1)*(yCenter - y1);
        } else if (xCenter <= x1 && yCenter > y1 && yCenter < y2) {
            // 如果圓心在長方形左側
            d = (xCenter - x1)*(xCenter - x1);
        } else if (xCenter >= x2 && yCenter >= y2) {
            // 如果圓心在長方形右上角
            d = (xCenter - x2)*(xCenter - x2) + (yCenter - y2)*(yCenter - y2);
        } else if (xCenter >= x2 && yCenter <= y1) {
            // 如果圓心在長方形右下角
            d = (xCenter - x2)*(xCenter - x2) + (yCenter - y1)*(yCenter - y1);
        } else if (xCenter >= x2) {
            // 如果圓心在長方形右側
            d = (xCenter - x2)*(xCenter - x2);
        } else if (yCenter >= y2) {
            // 如果圓心在長方形上方
            d = (yCenter - y2)*(yCenter - y2);
        } else if (yCenter <= y1) {
            // 如果圓心在長方形下方
            d = (yCenter - y1)*(yCenter - y1);
        }
        return d <= radius*radius;
    }
};


C 語言程式碼


Runtime: 0 ms, beats 100.00%. Memory: 8.42 MB, beats 81.25%.
bool checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {
    int d;
    // 如果圓心在長方形內
    if (xCenter >= x1 && xCenter <= x2 && yCenter >= y1 && yCenter <= y2) {
        return true;
    } else if (xCenter <= x1 && yCenter >= y2) {
        // 如果圓心在長方形左上角
        d = (xCenter - x1)*(xCenter - x1) + (yCenter - y2)*(yCenter - y2);
    } else if (xCenter <= x1 && yCenter <= y1) {
        // 如果圓心在長方形左下角
        d = (xCenter - x1)*(xCenter - x1) + (yCenter - y1)*(yCenter - y1);
    } else if (xCenter <= x1 && yCenter > y1 && yCenter < y2) {
        // 如果圓心在長方形左側
        d = (xCenter - x1)*(xCenter - x1);
    } else if (xCenter >= x2 && yCenter >= y2) {
        // 如果圓心在長方形右上角
        d = (xCenter - x2)*(xCenter - x2) + (yCenter - y2)*(yCenter - y2);
    } else if (xCenter >= x2 && yCenter <= y1) {
        // 如果圓心在長方形右下角
        d = (xCenter - x2)*(xCenter - x2) + (yCenter - y1)*(yCenter - y1);
    } else if (xCenter >= x2) {
        // 如果圓心在長方形右側
        d = (xCenter - x2)*(xCenter - x2);
    } else if (yCenter >= y2) {
        // 如果圓心在長方形上方
        d = (yCenter - y2)*(yCenter - y2);
    } else if (yCenter <= y1) {
        // 如果圓心在長方形下方
        d = (yCenter - y1)*(yCenter - y1);
    }
    return d <= radius*radius;
}


沒有留言:

張貼留言