class Solution:
@staticmethod
def swap(heap, i, j):
heap[i], heap[j] = heap[j], heap[i]
def heapify(self, heap, i):
left, right = 2 * i + 1, 2 * i + 2
largest = i
if left < len(heap) and heap[left] > heap[largest]:
largest = left
if right < len(heap) and heap[right] > heap[largest]:
largest = right
if largest != i: # 调整当前子树为大顶堆
self.swap(heap, i, largest)
self.heapify(heap, largest)
def build_heap(self, heap: list):
# 从最后一个非叶子节点开始构建大根堆, len(heap)//2 - 1就是最后一个非叶子节点
for i in range(len(heap) // 2 - 1, -1, -1):
self.heapify(heap, i)
def getLeastNumbers(self, arr: list, k: int):
if not arr or k <= 0: return []
if len(arr) <= k: return arr
heap = arr[:k]
self.build_heap(heap) # 构建大根堆
for i in range(k, len(arr)):
if arr[i] < heap[0]: # 当前元素比堆根小,则弹出堆根并插入当前元素
heap[0] = arr[i]
self.heapify(heap, 0) # 重新调整堆根
return heap