最小的k个数
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
示例 1:
输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]
示例 2:
输入:arr = [0,1,2,1], k = 1
输出:[0]
import heapq #建立一个小顶堆
def getLeastNumbers(nums,k):
n = len(arr)
if n <= 0 or n<k:
return []
n,opposite = len(nums),[-1*i for i in nums[:k]] #把它改为负为了创建一个大根堆
heapq.heapify(opposite) #排序
for i in range(k,n):
if -opposite[0]>nums[i]: #一个新的值如果小于于第一个大的值替换
heapq.heappop(opposite)
heapq.heappush(opposite, -nums[i])
return [-x for x in opposite]
def getLeastNumbers(arr, k):
if k <= 0 or k > len(arr):
return []
heap = build_heap(arr[:k])
for i in range(k, len(arr)):
if arr[i] < heap[0]:
heap[0] = arr[i]
sink(heap, 0)
return heap
def sink(array, k):
n = len(array)
left = 2 * k + 1
right = 2 * k + 2
if left >= n: return
max_i = left
if right < n and array[left] < array[right]:
max_i = right
if array[max_i] > array[k]:
array[max_i], array[k] = array[k], array[max_i]
sink(array, max_i)
def build_heap(list_):
n = len(list_)
for i in range(n//2, -1, -1):
sink(list_, i)
return list_