[英]Find the K closest points to the origin (0, 0)
问题是,给定坐标列表,确定最接近原点的k坐标的数量。
我已经能够确定点和原点之间的距离,但是当过滤最近的k点时,我迷路了。 我决定将这个逻辑放在第二个for循环中,对距离最近到最远的数组进行排序,然后推送小于K的值。
function kClosest(points, k) { let length = []; let arr = []; let result = []; let a = 0; let b = 0; for (let i = 0; i < points.length; i++) { a = points[i][0]; //x coord b = points[i][1]; //y coord (y will always be second number or '1') length.push(parseFloat(calcHypotenuse(a, b).toFixed(4))) arr.push([points[i], length[i]]) } function calcHypotenuse(a, b) { return (Math.sqrt((a * a) + (b * b))); } for (let i = 0; i < k; i++) { arr = arr.sort(); result.push(arr[i][0]) } return result; } console.log(kClosest([ [-5, 4], [-6, -5], [4, 6] ], K = 2))
预期输出:[ - 5,4],[4,6] //我有[-5,4],[ - 6,-5]
我建议使用自定义排序 - 你可以传递Array.sort()
一个比较函数,如下所示:
function kClosest(points, k) { //sorts the array in place points.sort((point1, point2) => { const distanceFromOrigin1 = getDistanceFromOrigin(point1); const distanceFromOrigin2 = getDistanceFromOrigin(point2); //sort by distance from origin, lowest first return distanceFromOrigin1 - distanceFromOrigin2; }); //returns first k elements return points.slice(0, k); } function getDistanceFromOrigin(point) { const [x, y] = point; //array destructuring return (x*x) + (y*y); } console.log(kClosest([ [-5, 4], [-6, -5], [4, 6] ], 2))
有关自定义排序的更多详细信息,请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort 。
对整个阵列进行排序是浪费的,甚至可能无法实现。 这是浪费,因为这个问题没有要求所有元素的总排序,甚至不是k
元素。 使用基于比较的排序进行排序需要O(n log(n))
时间。 更一般地说,如果输入是数字流,则将所有数据存储在存储器中并对它们进行排序甚至是不可能的。
我对JavaScript知之甚少,但在一般的算法草皮上,我们可以使用以下两种方法之一更快地解决这个问题:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.