返回

善用「路飞」算法巧挑最小的k个数,轻松搞定热门面试题!

前端

各位亲爱的读者,欢迎来到本期技术博客,今天我们一起来探讨一道经典的面试题——「最小k个数」。这道题目的难度不大,但却经常出现在各种面试中,让求职者们头疼不已。今天,我将带你探索「路飞算法」,让你轻松搞定这个问题,在面试中脱颖而出。

题目

给定一个整数数组 arr,找出其中最小的 k 个数。例如,输入 4、5、1、6、2、7、3、8 这 8 个数字,则最小的 4 个数字是 1、2、3、4。

示例:

  • 示例 1:

输入:[4,5,1,6,2,7,3,8]

输出:[1,2,3,4]

  • 示例 2:

输入:[1,3,5,2,4,6,7,8]

输出:[1,2,3,4]

解析:

这道题目的关键在于如何高效地找出最小的 k 个数。最直接的方法是使用内置的排序函数,对数组进行排序,然后再取前 k 个数。这种方法虽然简单,但是时间复杂度较高,对于海量数据来说并不适用。

为了解决这个问题,我们可以引入「路飞算法」。该算法的时间复杂度为 O(n log k),其中 n 为数组的长度。算法步骤如下:

  1. 构建一个大小为 k 的最小堆。
  2. 遍历数组 arr,将每个元素与堆顶元素进行比较。
  3. 如果当前元素小于堆顶元素,则将当前元素与堆顶元素交换,并重新调整堆。
  4. 重复步骤 2 和 3,直到遍历完整个数组。
  5. 此 时,堆中存储的即是最小的 k 个数。

算法优点:

  • 时间复杂度为 O(n log k),效率较高。
  • 空间复杂度为 O(k),不需要额外空间。
  • 适用于海量数据的情况。

代码实现:

def find_k_smallest_nums(arr, k):
    # 构建最小堆
    import heapq
    min_heap = []
    for i in range(k):
        heapq.heappush(min_heap, arr[i])

    # 遍历数组,将每个元素与堆顶元素进行比较
    for i in range(k, len(arr)):
        if arr[i] < min_heap[0]:
            heapq.heappop(min_heap)
            heapq.heappush(min_heap, arr[i])

    # 堆中存储的最小的k个数
    return min_heap

# 测试代码
arr = [4, 5, 1, 6, 2, 7, 3, 8]
k = 4
result = find_k_smallest_nums(arr, k)
print(result)

结束语:

路飞算法作为一种高效的算法,可以帮助我们轻松搞定「最小k个数」这道面试题。希望今天的讲解对你有所帮助,也希望你在接下来的面试中能够取得优异的成绩。