返回
善用「路飞」算法巧挑最小的k个数,轻松搞定热门面试题!
前端
2023-09-14 23:48:44
各位亲爱的读者,欢迎来到本期技术博客,今天我们一起来探讨一道经典的面试题——「最小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 为数组的长度。算法步骤如下:
- 构建一个大小为 k 的最小堆。
- 遍历数组 arr,将每个元素与堆顶元素进行比较。
- 如果当前元素小于堆顶元素,则将当前元素与堆顶元素交换,并重新调整堆。
- 重复步骤 2 和 3,直到遍历完整个数组。
- 此 时,堆中存储的即是最小的 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个数」这道面试题。希望今天的讲解对你有所帮助,也希望你在接下来的面试中能够取得优异的成绩。