题目:

我们有一个由平面上的点组成的列表 points。需要从中找出 K 个距离原点 (0, 0) 最近的点。(这里,平面上两点之间的距离是欧几里德距离。)

你可以按任何顺序返回答案。除了点坐标的顺序之外,答案确保是唯一的。

示例 1:

输入:points = [[1,3],[-2,2]], K = 1

输出:[[-2,2]]


欧几里得距离,事实上就是二维平面直角坐标系两点的距离。任意一个点,它到原点(0,0)有个公式:


计算欧几里得距离pytorch 欧几里得距离公式例题_最小值

  • 排序

给定一个存放坐标点的列表,和一个指定的K,找出K个

离原点 最近的点,那么我只需要将其从小到大地排序,返回List[:K]即可。

def kClosest(points, K):   return sorted(key=lambda x:pow(x[0] ** 2 + x[1] ** 2,0.5))[:K]

这里使用了Python自带的排序算法,我们使用lambda匿名函数,以坐标到原点的记录为key,从小到大排序,返回前K个即可。

  • 优先队列(最小堆)

先来看看最小堆的性质:

  1. 任意节点小于它的所有子节点,最小元在堆的根上(堆序性)。
  2. 堆总是一棵完全树。即除了最底层,其他层的节点都被元素填满,且最底层尽可能地从左到右填入。

  从它的性质看来,它涉及到了子节点,那一定和二叉树有联系。


计算欧几里得距离pytorch 欧几里得距离公式例题_Python_02

上图就是一个经典的最小堆,可以发现最小元放在了堆的根节点上。知道了堆,那么就好办了,先使用列表存储K个坐标点到原点的距离(存储距离的同时,也要记录当前坐标在原列表的位置)。然后从K+1个开始遍历,不断地压入,删除堆中的最小元。遍历完之后,堆就只剩下了K个最短距离。使用列表推导式组成一个新列表即可。注:Python的heapq模块,使用的是最小堆,只会弹出最小元,因此本体应该使用负数。 、【-10 < -8 所以 -10被弹出了,-8是我们想要的,因为|-

8| < |-10|】 

import heapqdef kClosest(points, K: int):    q = [(-x**2-y**2,i) for i,(x,y) in enumerate(points[:K])]  #i存储位置索引    heapq.heapify(q)# 让列表具有堆特征    n = len(points)    for i in range(K,n):        x,y = points[i]        dist = -x**2 - y**2        heapq.heappushpop(q,(dist,i))#在弹出最小值之前将(dist,i)压入到q上    ans = [points[identity] for (_,identity) in q]    return ans

计算欧几里得距离pytorch 欧几里得距离公式例题_最小堆_03

heappushpop方法与heapreplace方法相反;

heap push pop会先压入heap,再弹出最小值。