日期: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;
}
沒有留言:
張貼留言