【算法】简述统计一个圆中点的数目(纪录篇)

在这里插入图片描述

首先还是老规矩先亮剑,展现出这次的题目

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

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

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

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

示例一:

在这里插入图片描述

输入: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] 是蓝色的圆。
示例二:

在这里插入图片描述

输入: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
所有的坐标都是整数。
观题感

首先看题是给到了很多的圆,并且给出了很多坐标点,需要得到的结果是给出的圆里面包含了多少个点。那么按照高中的所学的圆的知识当中(也不知道是初中还是高中,微风中凌乱了,这个先不管,先思考题),可以怎么来解决这个问题呢。
在这里插入图片描述

那么通过万千痛苦的回忆,我想到了一个简单的解决方法,这个点离圆心的距离只要不超过半径那么当前这个点肯定是在这个圆内的。
在这里插入图片描述

说干就干,直接 通过遍历圆点和坐标点,通过三角公式(x的二次方)+(y的二次方)=(r的二次方) ,反正就是两个短边的平方和等于第三边的平方,人狠话不多,直接上代码:

public int[] countPoints(int[][] points, int[][] queries) {
        int[] res = new int[queries.length];
        for (int i = 0; i < queries.length; i++) {
            int[] circle = queries[i];
            int r = circle[2];
            int y = circle[1];
            int x = circle[0];
            for (int j = 0; j <points.length ; j++) {
                int[] point =points[j];
                int y1 = point[1];
                int x1 = point[0];
                // java的Math函数求正平方根
                double len = Math.sqrt((y1-y)*(y1-y)+(x1-x)*(x1-x));
                if(r>=len){
                    res[i]++;
                }
            }
        }
        return res;
    }
结果

那么最后的出来的结果肯定是对的。
但是执行效率上低了一点,把求函数正平方根的方法优化一下,弃用函数使用半径平方做if条件对比:

 public int[] countPoints(int[][] points, int[][] queries) {
        int[] res = new int[queries.length];
        for (int i = 0; i < queries.length; i++) {
            for (int j = 0; j <points.length ; j++) {
                if((queries[i][2]*queries[i][2])>=((points[j][1]-queries[i][1])*(points[j][1]-queries[i][1])+(points[j][0]-queries[i][0])*(points[j][0]-queries[i][0]))){
                    res[i]++;
                }
            }
        }
        return res;
    }

在这里插入图片描述

总结

其实通过网络上查询过后知道了这种方法就模拟法,模拟法就是:是指以一定的假设条件和数据为前提,借助仿真技术来估算任务的工期。比较常用的模拟法有蒙特卡洛模拟、三角模拟等。模拟法的计算量很大,通常在计算机的辅助下工作,可以计算和确定每件任务以及整个项目中各项任务工期的统计分布。
我简单的理解为:直接跟着逻辑翻译成代码执行就OK了。还需要大量的模拟实践。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值