统计一个圆中点的数目
难度:
标签:
题目描述
给你一个数组 points
,其中 points[i] = [xi, yi]
,表示第 i
个点在二维平面上的坐标。多个点可能会有 相同 的坐标。
同时给你一个数组 queries
,其中 queries[j] = [xj, yj, rj]
,表示一个圆心在 (xj, yj)
且半径为 rj
的圆。
对于每一个查询 queries[j]
,计算在第 j
个圆 内 点的数目。如果一个点在圆的 边界上 ,我们同样认为它在圆 内 。
请你返回一个数组 answer
,其中 answer[j]
是第 j
个查询的答案。
示例 1:

输入: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:

输入: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 <= xi, yi <= 500
1 <= queries.length <= 500
queries[j].length == 3
0 <= xj, yj <= 500
1 <= rj <= 500
- 所有的坐标都是整数。
代码结果
运行时间: 376 ms, 内存: 16.3 MB
/*
* 思路:
* 使用 Java Stream 流式处理来实现上述逻辑。
* 对于每个查询,使用 filter 和 count 方法过滤并计算在圆内的点。
*/
import java.util.Arrays;
public class Solution {
public int[] countPoints(int[][] points, int[][] queries) {
return Arrays.stream(queries)
.mapToInt(query -> (int) Arrays.stream(points)
.filter(point -> Math.pow(point[0] - query[0], 2) + Math.pow(point[1] - query[1], 2) <= Math.pow(query[2], 2))
.count())
.toArray();
}
}
解释
方法:
该题解采用了直接遍历的方法来解决问题。对于每个查询圆,通过一个辅助函数 `inside` 来判断每个点是否位于该查询圆内。具体而言,对于每个查询圆心 `(x0, y0)` 和半径 `r`,函数 `inside` 会遍历所有点 `(x, y)`,计算点到圆心的距离的平方 `(x-x0)^2 + (y-y0)^2`,并检查该值是否小于等于半径的平方 `r^2`。如果是,说明点在圆内或圆边上,累计计数。最后,将每个查询的结果存入结果数组 `res` 中。
时间复杂度:
O(p * q)
空间复杂度:
O(q)
代码细节讲解
🦆
在函数中计算点到圆心的距离时,使用平方的形式而不是实际距离(即不开根号)有什么特别的考虑吗?
▷🦆
对于在圆的边界上的点,题解中同样将其计算在内,这种处理方式是否在所有相关题目中都是标准的?
▷🦆
给定解法中直接遍历所有点来判断是否在圆内,是否考虑了点的分布可能会非常稀疏或者非常集中的情况?这会对性能有什么影响?
▷🦆
在实际应用中,如果点的坐标或查询圆的参数非常大,是否需要考虑数值计算过程中的整数溢出问题?
▷