leetcode 973. 最接近原点的 K 个点

  1. 题目链接 https://leetcode-cn.com/problems/k-closest-points-to-origin/

  2. 题目描述

    1. 我们有一个由平面上的点组成的列表 points。需要从中找出 K 个距离原点 (0, 0) 最近的点。

      (这里,平面上两点之间的距离是欧几里德距离。)

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

    2. 输入:points = [[1,3],[-2,2]], K = 1
      输出:[[-2,2]]
      解释: 
      (1, 3) 和原点之间的距离为 sqrt(10),
      (-2, 2) 和原点之间的距离为 sqrt(8),
      由于 sqrt(8) < sqrt(10),(-2, 2) 离原点更近。
      我们只需要距离原点最近的 K = 1 个点,所以答案就是 [[-2,2]]。
      

      示例 2:

      输入:points = [[3,3],[5,-1],[-2,4]], K = 2
      输出:[[3,3],[-2,4]]
      (答案 [[-2,4],[3,3]] 也会被接受。)
      
  3. 解题思路

    1. 最大堆:维护一个最大堆,遍历points,当堆的size小于K时,在末尾处追加point,或者当point的距离小于堆顶时,替换掉堆顶,并维护堆。
    2. sorted:简单粗暴,升序排序后取前k个数
  4. 代码

    1. python
      class Solution:
          def kClosest(self, points, K):
              #return sorted(points, key=lambda a: a[0] ** 2 + a[1] ** 2)[:K]
              import heapq
              res = []
              for point in points:
                  dis = point[0] ** 2 + point[1] ** 2
                  if len(res) < K:
                      res.append([dis] + point)
                      heapq._siftdown_max(res, 0, len(res) - 1)
                  elif res[0][0] > dis:
                      res[0] = [dis] + point
                      heapq._siftup_max(res, 0)
              return [it[1:] for it in res]

猜你喜欢

转载自blog.csdn.net/qq_38043440/article/details/89039817