📜  算法|排序|问题11(1)

📅  最后修改于: 2023-12-03 15:11:32.870000             🧑  作者: Mango

算法 | 排序 | 问题11

在排序算法中,问题11涉及到的是“求最小的k个数”,也称为“前k小问题”。具体来说,就是给定包含n个整数的数组和一个整数k,找出数组中最小的k个数。

解决方案

方法1:排序

将数组从小到大排序后取前k个数即可。时间复杂度为O(nlogn),空间复杂度为O(1)。

def min_k_nums(nums, k):
    nums.sort()
    return nums[:k]

方法2:堆排序

维护一个大小为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]
总结

从时间复杂度和空间复杂度的角度考虑,使用堆排序是较优的选择,但相应的代码比排序法稍微复杂一些。在实际工作中,需要根据具体问题的规模和性质选择合适的算法。