1828. 统计一个圆中点的数目

提示

中等

59

相关企业

给你一个数组 ​​points​​ ,其中 ​​points[i] = [xi, yi]​​ ,表示第 ​​i​​ 个点在二维平面上的坐标。多个点可能会有 相同 的坐标。

同时给你一个数组 ​​queries​​ ,其中 ​​queries[j] = [xj, yj, rj]​​ ,表示一个圆心在 ​​(xj, yj)​​ 且半径为 ​​rj 的圆。

对于每一个查询 ​​queries[j]​​ ,计算在第 ​​j​​ 个圆  点的数目。如果一个点在圆的 边界上 ,我们同样认为它在圆  。

请你返回一个数组 ​answer​​ ,其中 ​answer[j]​​是第 ​​j​​ 个查询的答案。

 

示例 1:

[leetcode每日一题]*3.7(补)_简单模拟

输入:points = [[1,3],[3,3],[5,3],[2,2]], queries = [[2,3,1],[4,3,1],[1,1,2]]
输出:[3,2,2]
解释:所有的点和圆如上图所示。
queries[0] 是绿色的圆,queries[1] 是红色的圆,queries[2] 是蓝色的圆。

示例 2:

[leetcode每日一题]*3.7(补)_简单模拟_02


输入:points = [[1,1],[2,2],[3,3],[4,4],[5,5]], queries = [[1,2,2],[2,2,2],[4,3,2],[4,3,3]]
输出:[2,3,2,4]
解释:所有的点和圆如上图所示。
queries[0] 是绿色的圆,queries[1] 是红色的圆,queries[2] 是蓝色的圆,queries[3] 是紫色的圆。

 

提示:

  • ​1 <= points.length <= 500​
  • ​points[i].length == 2​
  • ​0 <= x​​​​​​i, y​​​​​​i <= 500​
  • ​1 <= queries.length <= 500​
  • ​queries[j].length == 3​
  • ​0 <= xj, yj <= 500​
  • ​1 <= rj <= 500​
  • 所有的坐标都是整数。

Solution

简单模拟,进阶的话可以对横坐标二分查找减少需要进行计算的次数。(横坐标大于圆心-r小于圆心+r)

class Solution:
def countPoints(self, points: List[List[int]], queries: List[List[int]]) -> List[int]:
def calDist(x1, y1, x2, y2) -> float:
return sqrt((x1-x2) ** 2 + (y1 - y2) ** 2)
m = len(points)
n = len(queries)
res = [0] * n
for i in range(n):
x1, y1, r = queries[i]
for j in range(m):
x2, y2 = points[j]
if calDist(x1, y1, x2, y2) <= r:
res[i] += 1
return res