[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的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题笔记-数据结构-day21

LeetCode刷题笔记-数据结构-day21

LeetCode刷题笔记-数据结构-day21

Leetcode刷题Python16. 最接近的三数之和

算法系列之--Javascript和Kotlin的希尔排序算法(原)

Leetcode——最接近原点的 K 个点(快排)