给你一个点数组 points 和一个表示角度的整数 angle ,你的位置是 location ,其中 location = [posx, posy] 且 points[i] = [xi, yi] 都表示 X-Y 平面上的整数坐标。
最开始,你面向东方进行观测。你 不能 进行移动改变位置,但可以通过 自转 调整观测角度。换句话说,posx 和 posy 不能改变。你的视野范围的角度用 angle 表示, 这决定了你观测任意方向时可以多宽。设 d 为逆时针旋转的度数,那么你的视野就是角度范围 [d - angle/2, d + angle/2] 所指示的那片区域。
输入:points = [[2,1],[2,2],[3,3]], angle = 90, location = [1,1] 输出:3 解释:阴影区域代表你的视野。在你的视野中,所有的点都清晰可见,尽管 [2,2] 和 [3,3]在同一条直线上,你仍然可以看到 [3,3] 。
1.子区间最大值往往是滑动窗口,看数据范围10^5可以排序,找到一个抽象方式抽象城res数组,最res数组用滑动窗口即可
class Solution: def visiblePoints(self, points: List[List[int]], angle: int, location: List[int]) -> int: import math degs, res = [], 0 for [x, y] in points: if x == location[0] and y == location[1]: # 重点:排除跟视点重合的点 res += 1 else: # 求反切的角度 degs.append(math.atan2(y - location[1], x - location[0]) * 180 / math.pi) degs.sort() # O(NlogN) degs=degs + [an + 360 for an in degs] cnt=0 left=right=0 while right<len(degs): if degs[right]-degs[left]<=angle:cnt=max(cnt,right-left+1) right+=1 while left<right and right<len(degs) and degs[right]-degs[left]>angle: left+=1 return res + cnt