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.