目标
给你一个以 (radius, xCenter, yCenter) 表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2) ,其中 (x1, y1) 是矩形左下角的坐标,而 (x2, y2) 是右上角的坐标。
如果圆和矩形有重叠的部分,请你返回 true ,否则返回 false 。
换句话说,请你检测是否 存在 点 (xi, yi) ,它既在圆上也在矩形上(两者都包括点落在边界上的情况)。
示例 1 :

输入:radius = 1, xCenter = 0, yCenter = 0, x1 = 1, y1 = -1, x2 = 3, y2 = 1
输出:true
解释:圆和矩形存在公共点 (1,0) 。
示例 2 :
输入:radius = 1, xCenter = 1, yCenter = 1, x1 = 1, y1 = -3, x2 = 2, y2 = -1
输出:false
示例 3 :

输入:radius = 1, xCenter = 0, yCenter = 0, x1 = -1, y1 = 0, x2 = 0, y2 = 1
输出:true
说明:
- 1 <= radius <= 2000
- -10^4 <= xCenter, yCenter <= 10^4
- -10^4 <= x1 < x2 <= 10^4
- -10^4 <= y1 < y2 <= 10^4
思路
平面坐标中有一个圆 (radius, xCenter, yCenter) 和一个平行于坐标轴的矩形 (x1, y1, x2, y2),判断圆和矩形是否重叠。
求出圆心到矩形的最短距离,然后判断最短距离与圆的半径关系。最短距离为 dx^2 + dy^2 = (x - xCenter)^2 + (y - yCenter)^2,要使距离最小,分别使 |dx| 与 |dy| 最小即可。
要使 x1 <= x <= x2 与 xCenter 的距离最小,
- 当
x1 <= xCenter <= x2时,取x = xCenter; - 当
xCenter < x1时,取x = x1; - 当
xCenter > x2时,取x = x2;
可简化为 x = Math.max(x1, Math.min(xCenter, x2)),同理 y = Math.max(y1, Math.min(yCenter, y2))。
代码
/**
* @date 2026-09-22 10:18
*/
public class CheckOverlap1401 {
public boolean checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) {
int dx = Math.max(x1, Math.min(xCenter, x2)) - xCenter;
int dy = Math.max(y1, Math.min(yCenter, y2)) - yCenter;
return dx * dx + dy * dy <= radius * radius;
}
}
性能
