leetcode 1610. 可见点的最大数目 【几何+滑动窗口】

在这里插入图片描述在这里插入图片描述
思路:
题意是,站在观察点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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值