思路:
题意是,站在观察点location的位置,在视角angle的范围内,可以看到的最多的点个数,且同一直线遮挡的或者重叠的点可以记为多个。
先计算每个点与location的直线与x正轴之间的夹角,并从小到大排序。以每个夹角上的点为视线的起始范围,遍历比它大的角度,寻找能构成最大视角的右边界点。
计算夹角可以用math.atan2(y, x), 它的范围为(-pi, pi), 因为视角的范围是360度的环,故给每个角加360度,加入角度列表。
code:
class Solution:
def visiblePoints(self, points: List[List[int]], angle: int, location: List[int]) -> int:
# 先计算每个点和location的连线与x正轴的夹角
angles = []
same_points = 0
for posx, posy in points:
if posx == location[0] and posy == location[1]:
same_points += 1
else:
# angles 的范围是[-pi, pi],
angles.append(math.atan2((posy - location[1]),
(posx - location[0])) / math.pi * 180)
# 夹角从小到大排序
angles.sort()
# 观察角度的范围是一个环,故每个角度加360
n = len(angles)
angles += [a + 360 for a in angles]
right = 0
ans = 0
for i in range(n):
while right < 2*n and angles[right] - angles[i] <= angle:
right += 1
ans = max(ans, right - i)
return ans + same_points