📅  最后修改于: 2023-12-03 15:11:32.870000             🧑  作者: Mango
在排序算法中,问题11涉及到的是“求最小的k个数”,也称为“前k小问题”。具体来说,就是给定包含n个整数的数组和一个整数k,找出数组中最小的k个数。
将数组从小到大排序后取前k个数即可。时间复杂度为O(nlogn),空间复杂度为O(1)。
def min_k_nums(nums, k):
nums.sort()
return nums[:k]
维护一个大小为k的最大堆,遍历数组时,将每个数与堆顶元素比较,如果小于堆顶元素,则将堆顶元素弹出,插入当前数,保证最大堆的大小不超过k。遍历完成后,堆中的元素即为最小的k个数。时间复杂度为O(nlogk),空间复杂度为O(k)。
import heapq
def min_k_nums(nums, k):
if k >= len(nums):
return nums
max_heap = []
for num in nums:
if len(max_heap) < k:
heapq.heappush(max_heap, -num)
elif num < -max_heap[0]:
heapq.heappop(max_heap)
heapq.heappush(max_heap, -num)
return [-num for num in max_heap]
从时间复杂度和空间复杂度的角度考虑,使用堆排序是较优的选择,但相应的代码比排序法稍微复杂一些。在实际工作中,需要根据具体问题的规模和性质选择合适的算法。