题目描述
牛客网
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
解法1:直接排序,然后返回
最暴力,排序后前k个数就是最小的k个数,时间复杂度为O(nlogn)
解法2:原地构造大根堆
这里只对前K个数构建大根堆,于是初始化建堆的时间复杂度为O(k),排序重建堆的时间复杂度为nlog(k),所以总的时间复杂度为O(k+nlogk)=O(nlogk)
解法3:STL实现
将前K个数依次放入大根堆中,从第K个数开始,只要堆顶的最大元素比第i个数大,就交换,然后重新对这K个数建大根堆。对于input[i],其实变不变已经无所谓了(如果不修改,则原始数据不会改变)。