解题思路:Angular Sweep
代码如下:
import math
class Solution:
def numPoints(self, points: List[List[int]], r: int) -> int:
size = len(points)
if size == 0:
return 0
#vec[i][j]表示points[i]指向points[j]的向量
vec = [[[0, 0] for j in range(size)] for i in range(size)]
for i in range(size):
for j in range(i+1, size):
jx, jy = points[j][0], points[j][1]
ix, iy = points[i][0], points[i][1]
vec[i][j] = [jx-ix, jy-iy]
vec[j][i] = [ix-jx, iy-jy]
def helper(i):
angular = []
for j in range(size):
if i != j and (dist:= sum([x**2 for x in vec[i][j]])) <= 4*r*r:
C = math.acos(math.sqrt(dist) / (2 * r))
T = math.atan2(vec[i][j][1], vec[i][j][0])
theta1 = T - C #进入圆
theta2 = T + C #离开圆
angular.append([theta1, 1])
angular.append([theta2, 0])
res = cnt = 1
angular.sort(key=lambda x:[x[0], -x[1]])
for a in angular:
if a[1]:
cnt += 1
else:
cnt -=1
res = max(res, cnt)
return res
ans = 0
for i in range(size):
ans = max(ans, helper(i))
return ans