Fevereiro —— 703. Resumo do K-ésimo maior elemento no fluxo de dados e heap e o uso de API

Antes de falar sobre este tópico hoje, vamos falar sobre uma estrutura de dados: heap. A pilha é dividida na pilha maior e na pilha menor. O heap máximo é quando o valor do nó pai é sempre maior ou igual ao valor de qualquer nó filho. O valor do nó pai é sempre menor ou espera que o valor de qualquer nó filho do usuário seja o heap mínimo. Na verdade, para ser franco, é uma estrutura de dados de árvore binária completa. Conforme mostrado na figura abaixo, a esquerda é o maior heap e a direita é o menor heap .

A aplicação do heap máximo e do heap mínimo é semelhante à fila de prioridade, e um valor máximo ou mínimo pode ser exibido todas as vezes. Claro, há também uma API correspondente em python. A seguir, o método da API de heap é explicado de maneira aproximada:

#导入堆
import heapq

#将list转化堆
heapq.heapify(x)
#将item添加到堆中,保持堆的不变性
heapq.heappush(heap, item)
#弹出并返回heap中的最小元素
heapq.heappop(heap)
#将 item 放入堆中,然后弹出并返回 heap 的最小元素。该组合操作比先调用  heappush() 再调用 heappop() 运行起来更有效率。
heapq.heappushpop(heap, item)
#弹出并返回 heap 中最小的一项,同时推入新的 item。 堆的大小不变
heapq.heapreplace(heap, item)

#返回前n个最大或者最小的元素
heapq.nlargest(n, iterable, key=None)
heapq.nsmallest(n, iterable, key=None)
#将多个已排序的输入合并为一个已排序的输出
heapq.merge(*iterables, key=None, reverse=False)

 Análise: Esta questão busca o K-ésimo maior elemento, então podemos construir um heap mínimo, o tamanho desse heap é mantido em k elementos e o elemento no topo do heap passa a ser o K-ésimo maior elemento.

class KthLargest:

    def __init__(self, k: int, nums: List[int]):
       
        #维护一个最小堆,堆顶的元素是最小的
        self.k = k
        self.heap = nums   
        heapq.heapify(self.heap)
        #堆顶的元素不断弹出,维护一个含有K个元素大小的最小堆
        while len(self.heap) > k:
            heapq.heappop(self.heap)


    def add(self, val: int) -> int:
        #将元素添加到最小堆中去
        heapq.heappush(self.heap,val)
        #添加之后的元素如果大于k,那就弹出堆顶元素
        if len(self.heap)>self.k:
            heapq.heappop(self.heap)

        #返回堆顶元素
        return self.heap[0]



# Your KthLargest object will be instantiated and called as such:
# obj = KthLargest(k, nums)
# param_1 = obj.add(val)

Resumo: apenas o heap mínimo é implementado na API Python, mas o heap máximo não é implementado.

Acho que você gosta

Origin blog.csdn.net/weixin_37724529/article/details/113842674
Recomendado
Clasificación