最小的k个数(partition操作)
Last updated
Last updated
问题简述
思路1:快排中的 partition 过程
快排的过程:
partition 过程:以数组某个元素(一般取首元素)为基准数,将所有小于基准数的元素移动至其左边,大于基准数的元素移动至其右边。
递归地对左右部分执行 partition 过程,直至区域内的元素数量为 1;
基于以上思想,当某次划分后基准数正好是第 k+1 小的数字,那么此时基准数左边的所有数字便是题目要求的最小的 k 个数。
思路2:堆(优先队列)
写法1) 维护一个长度为 k 的大顶堆(第一个数最大),当下一个元素小于堆顶值,就更新堆(弹出堆顶,插入新值);
写法2) 直接对整个数组构建一个小顶堆,然后循环弹出前 k 个值;
注意写法1 的时间复杂度是 O(NlogK)
,而写法2 是 O(NlogN)
;
思路3:计数排序
因为题目限制了 arr[i]
的范围,所以还可以使用计数排序,时间复杂度 O(N)
;