Estructuras de datos y algoritmos: los principales problemas de K

La pregunta K principal es una pregunta que a menudo se prueba en entrevistas y, a menudo, se puede resolver clasificando (clasificando) y montones (montones de raíz grandes / pequeños). Por supuesto, si solo puede hacer cola rápidamente, puede terminar la entrevista antes e irse a casa a cenar.

en conclusión:

El problema K superior a menudo se resuelve con un montón

1. Encuentra los k números más pequeños en la matriz

tema:

Diseñe un algoritmo para encontrar los k números más pequeños en la matriz. Los números k se pueden devolver en cualquier orden.

Ejemplo:

输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]

1.1 Clasificación rápida, O(inicio de sesión), O(inicio de sesión)

El método más fácil de pensar es la ordenación rápida, que tiene una complejidad de tiempo de O(nlogn) y una complejidad de espacio de O(logn)

código:

class Solution:
    def smallestK(self, arr: List[int], k: int) -> List[int]:
        arr.sort()
        return arr[:k]

1.2 Montón raíz grande, O(nlogk), O(k)

Usamos un montón raíz grande para mantener los k valores pequeños superiores de la matriz en tiempo real. Primero inserte los primeros números k en el montón raíz grande y luego comience a recorrer desde el número k + 1. Si el número recorrido actualmente es más pequeño que el número en la parte superior del montón raíz grande, extraiga el número en la parte superior del montón y luego inserte el número recorrido actualmente. Finalmente, almacene el número en el montón raíz grande en la matriz y devuélvalo.

Dado que el montón creado por la biblioteca heapq en Python es un montón raíz pequeño, debemos tomar el opuesto de todos los números en la matriz para convertirlo en un montón raíz grande.

código:

class Solution:
    def smallestK(self, arr: List[int], k: int) -> List[int]:
        if not arr or k==0:
            return []
        heap=[-x for x in arr[:k]]
        heapq.heapify(heap)
        for x in arr[k:]:
            if -heap[0]>x:
                heapq.heappop(heap)
                heapq.heappush(heap,-x)
        return [-x for x in heap]

Análisis de complejidad:

  • Complejidad temporal: O(nlogk), donde n es la longitud del arreglo arr. Dado que el montón raíz grande mantiene los primeros k valores pequeños en tiempo real, la complejidad de tiempo de inserción y eliminación es O (logk). En el peor de los casos, se insertarán n números en la matriz, por lo que se requiere una complejidad de tiempo total de O (nlogk).
  • Complejidad del espacio: O(k), porque hay como máximo k números en el montón raíz grande

Los temas relacionados se actualizan continuamente...

Supongo que te gusta

Origin blog.csdn.net/qq_43799400/article/details/131753582
Recomendado
Clasificación