文章目录
【面试题40 最小的k个数】
难度: 简单
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
Leetcode题目对应位置: 面试题40:最小的k个数
思路 1:对原数组从小到大排序后取出前 k 个数即可。emmm
时间复杂度:O(nlogn),数组长度为 n,排序所需的额外时间复杂度
空间复杂度:O(logn),排序所需的额外空间复杂度
class Solution:
def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
arr.sort()
return arr[:k]
思路 2:用大根堆。用一个大根堆实时维护数组的前 kk 小值。首先将前 kk 个数插入大根堆中,随后从第 k+1k+1 个数开始遍历,如果当前遍历到的数比大根堆的堆顶的数要小,就把堆顶的数弹出,再插入当前遍历到的数。最后将大根堆里的数存入数组返回即可。
时间复杂度:O(nlogk),数组长度为 n,大根堆维护前 k 个最小值
空间复杂度:O(k),大根堆里最多 k 个数
class Solution:
def getLeastNumbers(self, arr: List[int], k: int) -> List[int]:
if k == 0:
return list()
hp = [-x for x in arr[:k]]
heapq.heapify(hp)
for i in range(k, len(arr)):
if -hp[0] > arr[i]:
heapq.heappop(hp)
heapq.heappush(hp, -arr[i])
ans = [-x for x in hp]
return ans