剑指 Offer 40. 最小的k个数(代码待补)
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
力扣地址
面试有被问到这个问题,估计是想考快排partition的思想,但是当时没想到。当时想到了的是堆和二分,但是这个数组是完全没有顺序的,就不能用二分。可以用堆结构来做。
1.维护大小为k的堆
堆排序不重要,但是堆结构非常重要hh
时间复杂度:O(nlogk)
维护一个有k个数的大根堆,这个堆代表目前选出的k个最小的数。在堆的k个元素中堆顶元素是最小的k个数中最大的那个。
接下来要遍历整个数组,遍历的过程中看当前数是否比堆顶元素小。如果是,就把堆顶元素替换成当前数,然后调整堆。如果不是,则不做任何操作,继续遍历下一个数。在遍历完成后,堆中的k个数就是所有数组中最小的k个数。