Javascript 在线性时间内距离原点最近的K点?
在线性时间O(N)内解决这个问题是个问题吗?解决这个问题的唯一方法是使用sort(),它给了我O(NlogN)时间 问题: 我们有一张飞机上的点列表。查找距离原点(0,0)最近的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(
/*
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)。