1401. 圆和矩形是否有重叠
难度中等56
给你一个以 (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
-104 <= xCenter, yCenter <= 104
-104 <= x1 < x2 <= 104
-104 <= y1 < y2 <= 104
https://leetcode.cn/problems/circle-and-rectangle-overlapping/solution/yan-zheng-ju-xing-qu-yu-nei-de-dian-dao-yuan-xin-z/
基本思路:矩形区域内点离圆心最近的点距离小于等于圆的半径
矩形区域特点是x,y取值相互独立,又距离公式对x,y分别单调,分别取最小距离即可
又由 x1 < x2 , y1 < y2
可以简化最小距离获取过程
对于 x
-
x_center < x1 < x2 =>min(dx) = x1 - x_center
-
x1 <= x_center <= x2 =>min(dx) = 0
-
x1 < x2 < x_center =>min(dx) = x_center - x2
对于 y 同理
class Solution {
public boolean checkOverlap(int radius, int x_center, int y_center, int x1, int y1, int x2, int y2) {
int dx = x1 > x_center ? x1 - x_center : x2 < x_center ? x_center - x2 : 0;
int dy = y1 > y_center ? y1 - y_center : y2 < y_center ? y_center - y2 : 0;
return dx * dx + dy * dy <= radius * radius;
}
}
y2 : 0;
return dx * dx + dy * dy <= radius * radius;
}
}