题目链接:1401. 圆和矩形是否有重叠(中等)
算法原理:
解法:找距离圆心最近的点
时间复杂度O(1)
0ms击败100.00%
题目给的提示:找到正方形上距离圆心最近的点,计算该点到圆心的距离,并判断其是否小于等于半径
我们要做的两件事:
①找到在矩形中到圆心(xCenter,yCenter)最近的点(x,y)
②勾股定理判断点(x,y)是否在圆中
其中x1≤x≤x2,y1≤y≤y2
勾股定理得到d²=(x-xCenter)²+(y-yCenter)²
为了最小化上述的值,我们需要让(x,y)尽可能的接近圆心(xCenter,yCenter)
对于x:
当x1≤xCenter≤x2时(圆心在正方形内):x=xCenter
当xCenter≤x1时(圆心在正方形左侧):x=x1
当x2≤xCenter时(圆心在正方形右侧):x=x2
我们可以用一句话总结上述情况:xCenter与x2取最小值,xCenter与x1取最大值
用公式表示为x=max(x1,min(xCenter,x2))
对于y同理:y=max(y1,min(yCenter,y2))
最后返回 (x-xCenter)²+(y-yCenter)² ≤ radius² 即可
Java代码:
class Solution { //1401. 圆和矩形是否有重叠 public boolean checkOverlap(int radius, int xCenter, int yCenter, int x1, int y1, int x2, int y2) { //找到在矩形中的到圆心(xCenter,yCenter)最近的点(x,y) int x=Math.max(x1,Math.min(xCenter,x2)); int y=Math.max(y1,Math.min(yCenter,y2)); //判断(x,y)是否在圆中 return (x-xCenter)*(x-xCenter)+(y-yCenter)*(y-yCenter)<=radius*radius; } }