【劍指】最小的k個數

維護一個大小爲k的大根堆

class Solution:
    def heapfy(self,arr,i,length):
        left = 2*i+1
        right = 2*i+2
        if left<length and arr[left]>arr[i]:
            large = left
        else:
            large = i
        if right<length and arr[right]>arr[large]:
            large = right
        if i != large:
            arr[i], arr[large] = arr[large], arr[i]
            self.heapfy(arr,large,length)

    def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
        def build_heap(arr,k):
            for i in range((k-1)//2,-1,-1):
                self.heapfy(arr,i,k)
        build_heap(arr,k)
        for i in range(k,len(arr)):
            if arr[i] < arr[0]:
                arr[0], arr[i] = arr[i], arr[0]
                self.heapfy(arr,0,k)
        return arr[:k]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章