题目描述
给你一个以 (radius
, x_center
, y_center
) 表示的圆和一个与坐标轴平行的矩形 (x1
, y1
, x2
, y2
),其中 (x1
, y1
) 是矩形左下角的坐标,(x2
, y2
) 是右上角的坐标。
如果圆和矩形有重叠的部分,请你返回 True
,否则返回 False
。
换句话说,请你检测是否 存在 点 (xi
, yi
) ,它既在圆上也在矩形上(两者都包括点落在边界上的情况)。
样例
输入:radius = 1, x_center = 0, y_center = 0, x1 = 1, y1 = -1, x2 = 3, y2 = 1
输出:true
解释:圆和矩形有公共点 (1,0)
输入:radius = 1, x_center = 0, y_center = 0, x1 = -1, y1 = 0, x2 = 0, y2 = 1
输出:true
输入:radius = 1, x_center = 1, y_center = 1, x1 = -3, y1 = -3, x2 = 3, y2 = 3
输出:true
输入:radius = 1, x_center = 1, y_center = 1, x1 = 1, y1 = -3, x2 = 2, y2 = -1
输出:false
提示:
1 <= radius <= 2000
-10^4 <= x_center, y_center, x1, y1, x2, y2 <= 10^4
x1 < x2
y1 < y2
算法分析
找规律
将所有满足的情况全部列出来
- 1、圆心在正方形内的情况
- 2、圆心在正方形的左,上,右,下四个方向
- 3、圆心在正方形的左上,右上,左下,右下四个方向
时间复杂度 $O(1)$
Java 代码
class Solution {
public boolean checkOverlap(int radius, int x_center, int y_center, int x1, int y1, int x2, int y2) {
//圆心在正方形内
if(x_center >= x1 && x_center <= x2 && y_center >= y1 && y_center <= y2) return true;
//左、上、右、下
if(x_center <= x1 && y_center >= y1 && y_center <= y2 && x_center + radius >= x1) return true;
if(y_center >= y2 && x_center >= x1 && x_center <= x2 && y_center - radius <= y2) return true;
if(x_center >= x2 && y_center >= y1 && y_center <= y2 && x_center - radius <= x2) return true;
if(y_center <= y1 && x_center >= x1 && x_center <= x2 && y_center + radius >= y1) return true;
//判断4个顶点是否在圆上
if( ((x1 - x_center) * (x1 - x_center) + (y1 - y_center) * (y1 - y_center) <= radius * radius) ||
((x2 - x_center) * (x2 - x_center) + (y1 - y_center) * (y1 - y_center) <= radius * radius) ||
((x1 - x_center) * (x1 - x_center) + (y2 - y_center) * (y2 - y_center) <= radius * radius) ||
((x2 - x_center) * (x2 - x_center) + (y2 - y_center) * (y2 - y_center) <= radius * radius) )
return true;
return false;
}
}