最小K个数
题目描述:
设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。
示例:
输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]
提示:
- 0 <= len(arr) <= 100000
- 0 <= k <= min(100000, len(arr))
解法
使用最大堆,先放入 k 个,对于剩下的数字,如果比堆顶元素小,就把堆顶元素弹出,把当前元素压入。python 中有最小堆,所以这里可以先将原数字取反,最后再复原。
代码
class Solution:
def smallestK(self, arr: List[int], k: int) -> List[int]:
if k == 0:
return []
res = [-x for x in arr[:k]]
heapq.heapify(res)
for i in range(k, len(arr)):
if res[0] < -arr[i]:
heapq.heapreplace(res, -arr[i])
res = [-x for x in res]
return res
测试结果
执行用时:72 ms, 在所有 Python3 提交中击败了 69.61% 的用户
内存消耗:20.5 MB, 在所有 Python3 提交中击败了 14.69% 的用户
说明
算法题来源:力扣(LeetCode)