链接
https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/
题意
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4
解法
同经典的Top k类似,这里是需要找出最小的k个数
使用分治和堆都可以进行求解
分治会用到快速排序中的Partition方法,对数组进行划分
使得左半边的数都比中间某个数小,右半边的数都比这个数大
直到这个中间的数正好是第k个数 结束运行
时间复杂度为O(n)
另一种解法是使用最小堆
每次保存最小的k个数
如果堆的容量已满 比较堆中最大的数和当前数
较小者放入堆中
时间复杂度为O(nlogk)
它的优点是第一没有修改数组输入的数据。
其二因为内存的大小有限,如果数据量太大不能一次性将数据全部读入
而这一方法只需要维护k个数的堆,适合海量数据存储
代码
分治解法
1 | class Solution { |
最小堆
1 | class Solution { |