Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在线性时间内距离原点最近的K点?_Javascript_Time Complexity - Fatal编程技术网

Javascript 在线性时间内距离原点最近的K点?

Javascript 在线性时间内距离原点最近的K点?,javascript,time-complexity,Javascript,Time Complexity,在线性时间O(N)内解决这个问题是个问题吗?解决这个问题的唯一方法是使用sort(),它给了我O(NlogN)时间 问题: 我们有一张飞机上的点列表。查找距离原点(0,0)最近的K个点 (此处,平面上两点之间的距离为欧几里德距离。) 您可以按任何顺序返回答案。答案保证是唯一的(除了它的顺序) 我的解决方案: /* d = sqrt ( (x-0)^2 + (y-0)^2 ) */ var kClosest = function(points, K) { points.sort(

在线性时间O(N)内解决这个问题是个问题吗?解决这个问题的唯一方法是使用sort(),它给了我O(NlogN)时间

问题: 我们有一张飞机上的点列表。查找距离原点(0,0)最近的K个点

(此处,平面上两点之间的距离为欧几里德距离。)

您可以按任何顺序返回答案。答案保证是唯一的(除了它的顺序)

我的解决方案:

/*
    d = sqrt ( (x-0)^2 + (y-0)^2 )
*/

var kClosest = function(points, K) {
    points.sort((a,b) => {
        const d1 = Math.sqrt(Math.pow(a[0], 2) + Math.pow(a[1], 2));
        const d2 = Math.sqrt(Math.pow(b[0], 2) + Math.pow(b[1], 2));
        return d1-d2;
    });
    return points.splice(0, K);
};

有一种方法,使用计数排序代替

如果最大X和Y坐标相当有限,您可以跳过使用
Math.sqrt
。您将得到一个
距离
整数值数组,该数组表示每个点到中心距离的平方

然后,从0到
最大可能距离
在该数组中循环,并打印找到的每个点,直到找到
K


这是我的实现(你可能会使它更漂亮,你假设我们不会有大于[100100]的点数。同时,你在for循环中的时间复杂度不是很高吗?是的,
相当有限
我的意思是点数在范围内([-50;50],-50;50]))。在这种情况下,第一个for循环可以被认为是O(1);而while循环,最坏的情况是,在O(N)项上循环-因此,在这种特殊情况下,算法的复杂度大约是O(N)。因此,是的,有时问题可以在O(N)中解我认为,当我们使用大O符号时,我们总是考虑最坏情况的情景,取决于你的问题的约束。在这种情况下,它总是O(n)。