方法一:内置函数sorted()
def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
return sorted(arr)[:k]
sorted()内部的排序方法为归并排序
时间复杂度O(nlogn) 空间复杂度O(logn)
方法二:最大堆最小堆
求最小k个数用最大堆,求最大k个数用最小堆。
堆是有序排列的完全二叉树,最大堆为根节点为最大值,且父节点比子节点的值大;最小堆为根节点为最小值,且父节点比子节点的值小。
在求最大的k个数时,首先构建一个有k个节点的最小堆,根节点为最小值,然后每新进来一个数,则与根节点比较,若比根节点大,则将该点推入堆,将堆中的最小值点(根节点)推出。遍历完之后,留在堆里的就是最大的k个。
python内置有最小堆库,heapq
heapq.heapify(list)
将list转换为最小堆形式
heapq.heappop(heap)
将heap的最小值推出
heapq.heappush(heap,x)
将x推入heap中
heapq.replace(heap,x)
将x推入,同时将heap中最小元素推出
def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
if k==0:
return []
hp=arr[:k]
heapq.heapify(hp)
for i in range(k,len(arr)):
if hp[0]<arr[i]