LeetCode 973 — K Closest Points to Origin

Tercer problema del patrón Heap. Top-K más cercanos: usa max-heap de tamaño k (echar al peor candidato cuando se llena).

Enunciado

Dado un array de puntos [x, y] y un entero k, devuelve los k puntos más cercanos al origen (distancia euclidiana).


Solución — Max-heap de tamaño k (negando distancias)

import heapq
 
class Solution:
    def kClosest(self, points, k):
        heap = []
        for x, y in points:
            d = -(x*x + y*y)                    # negado: max-heap
            if len(heap) < k:
                heapq.heappush(heap, (d, x, y))
            else:
                heapq.heappushpop(heap, (d, x, y))
        return [[x, y] for _, x, y in heap]

Análisis:

  • Tiempo: O(n log k).
  • Espacio: O(k).

heappushpop — atómico y más rápido

heappushpop(h, x) hace push+pop en una operación, más rápido que llamarlas por separado.

Sobre x*x + y*y (no sqrt)

No necesitamos la distancia real, solo comparar. Saltar la sqrt ahorra tiempo y evita errores de precisión.


Variante — Quickselect O(n) promedio

quickselect (variante de quicksort) encuentra el k-ésimo en O(n) promedio. Más complicado pero óptimo.


Conexiones

Estado

  • Leído
  • Implementado desde cero
  • Resuelto en LeetCode