输入整数数组 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]
限制:
0 <= k <= arr.length <= 10000
0 <= arr[i] <= 10000
class Solution:
def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
if k == 0 or len(arr) == 0:
return []
# print(arr)
n, k_arr = len(arr), [ -1 * x for x in arr[:k]]
# print(k_arr)
# print(k_arr[0])
# 下面是最小堆,索引0对应的值是最小值,那么我们将数字取反,那么最小值就是最大值来。
heapq.heapify(k_arr)
# print(arr[0])
for i in range(k, n):
# k_arr[0] 是最大堆中最大值,如果新加入的值小于该值,则将该值替换掉。
# print(k_arr[0])
if( -k_arr[0] > arr[i]):
heapq.heappop(k_arr)
# print(i)
# print(arr[i])
heapq.heappush(k_arr, -arr[i])
# print(k_arr)
return [-1 * j for j in k_arr]