[JavaScript 刷题] 排序 - 最接近原点的 K 个点, leetcode 973
Posted GoldenaArcher
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[JavaScript 刷题] 排序 - 最接近原点的 K 个点, leetcode 973相关的知识,希望对你有一定的参考价值。
[javascript 刷题] 排序 - 最接近原点的 K 个点, leetcode 973
github repo 地址: https://github.com/GoldenaArcher/js_leetcode,Github 的目录 大概 会更新的更勤快一些。
题目地址:973. K Closest Points to Origin
题目
如下:
Given an array of points where points[i] = [xi, yi] represents a point on the X-Y plane and an integer k, return the k closest points to the origin (0, 0).
The distance between two points on the X-Y plane is the Euclidean distance (i.e., √(x1 - x2)2 + (y1 - y2)2).
You may return the answer in any order. The answer is guaranteed to be unique (except for the order that it is in).
解题思路
其实就是 kth elements 的变种,用 堆排序(priority queue, 用 PQ 实现一个 max heap)、快速排序 都能比较好的解决问题。
主要麻烦的地方就在于,JavaScript 内部是没有实现 Priority Queue 的,所以根据需求可能需要手写一个 PQ,如果是 OA 这种情况会稍微尴尬一些,如果不是 OA 的话,问面试官是不是可以模拟一个 PQ 也可以。
这里使用的方法是新建一个长度为 K 的 PQ,如果新发现的点直径小于当前 heap 中的最大值时,将当前的点压入 heap 中。
以网上随便找了个图为例:
这个 max heap 中的最大值为 100,现在如果碰上了一个与原点距离只有 90 的点,,那么就需要移除最大值,将 90
压进 max heap 中,剩下的排序操作,让 PQ 去完成即可。
使用 JavaScript 解题
// mimic a max heap
const maxHeap = (arr) =>
arr.sort((a, b) => b[0] - a[0]);
;
const getArea = (loc) =>
const [x, y] = loc;
// omit Mqth.sqrt() here
return x * x + y * y;
;
/**
* @param number[][] points
* @param number k
* @return number[][]
*/
var kClosest = function (points, k)
const pq = [];
for (let i = 0; i < points.length; i++)
const area = getArea(points[i]);
if (pq.length < k)
pq.push([area, points[i]]);
continue;
maxHeap(pq);
if (area <= pq[0][0])
pq.shift();
pq.push([area, points[i]]);
return pq.reduce((accu, res) =>
accu.push(res[1]);
return accu;
, []);
;
以上是关于[JavaScript 刷题] 排序 - 最接近原点的 K 个点, leetcode 973的主要内容,如果未能解决你的问题,请参考以下文章