题解 | #最小的K个数#
最小的K个数
https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param input int整型一维数组
# @param k int整型
# @return int整型一维数组
#
class Solution:
def GetLeastNumbers_Solution(self , input: List[int], k: int) -> List[int]:
# write code here
# 如果用大顶堆的话,建立大小为k的大顶堆,如果剩下数字里面小于顶,就把顶端挪走,替换成小的值,再堆化,最后留下的k个即为结果。
def heapify(arr, i):
left = 2*i + 1
right = 2*i + 2
pos = i
if left < arr_len and arr[left] > arr[pos]:
pos = left
if right < arr_len and arr[right] > arr[pos]:
pos = right
if pos != i:
arr[i], arr[pos] = arr[pos], arr[i]
heapify(arr, pos)
def build_max_heap(arr): # 原地,所以不用返回值
import math
for i in range(math.floor(len(arr)/2), -1, -1):
heapify(arr, i)
if k == 0 or not input:
return []
temp = input[:k]
arr_len = k
build_max_heap(temp)
for i in range(k, len(input)):
if input[i] < temp[0]:
temp[0] = input[i]
heapify(temp, 0)
# 时间复杂度为 O(nlogk)
return temp
