classSolution:deftopKFrequent(self, nums, k:int):defbuildHeap(heap):for i inrange(len(heap)//2,-1,-1):
heapify(heap, i)defheapify(arr, i):
length =len(arr)
left, right, largest =2* i +1,2* i +2, i
if left < length and arr[left][1]< arr[largest][1]:
largest = left
if right < length and arr[right][1]< arr[largest][1]:
largest = right
if largest != i:
arr[i], arr[largest]= arr[largest], arr[i]
heapify(arr, largest)# if k == 0: return []
stat = collections.Counter(nums)
new_arr =list(stat.items())####################################################### TopK:小小小顶堆(最高频)
heap = new_arr[:k]
buildHeap(heap)# 构建小顶堆for i inrange(k,len(new_arr)):# 若当前元素 > 堆顶元素,则调整堆if new_arr[i][1]> heap[0][1]:
heap[0]= new_arr[i]
heapify(heap,0)# 这里只需调整堆顶return[p[0]for p in heap]# 返回可以无序####################################################### MinK:大大大顶堆(最低频)
heap =[(p[0],-p[1])for p in new_arr[:k]]# 存取细节与TopK不同!!!
buildHeap(heap)# 构建大顶堆for i inrange(k,len(new_arr)):# 若当前元素取反 > 堆顶元素,则调整堆if-new_arr[i][1]> heap[0][1]:
heap[0]=(new_arr[i][0],-new_arr[i][1])# 取反入堆!
heapify(heap,0)# 这里只需调整堆顶print(heap)return[p[0]for p in heap]# MinK