剑指 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个数。
2.快排的思想
[面试官提到的顺序统计学]( https://blog.csdn.net/chenxun_2010/article/details/41362941#:~:text=1、基本概念. 顺序统计量:在一个由n个元素组成的集合中,第i个顺序统计量是值该集合中第i小的元素。. ,%E4%BE%8B%E5%A6%82%E6%9C%80%E5%B0%8F%E5%80%BC%E6%98%AF%E7%AC%AC1%E4%B8%AA%E9%A1%BA%E5%BA%8F%E7%BB%9F%E8%AE%A1%E9%87%8F%EF%BC%8C%E6%9C%80%E5%A4%A7%E5%80%BC%E6%98%AF%E7%AC%ACn%E4%B8%AA%E9%A1%BA%E5%BA%8F%E7%BB%9F%E8%AE%A1%E9%87%8F%E3%80%82.%20%E4%B8%AD%E4%BD%8D%E6%95%B0%EF%BC%9A%E4%B8%80%E8%88%AC%E6%9D%A5%E8%AF%B4%EF%BC%8C%E4%B8%AD%E4%BD%8D%E6%95%B0%E6%98%AF%E6%8C%87%E5%AE%83%E6%89%80%E5%9C%A8%E9%9B%86%E5%90%88%E7%9A%84%E2%80%9C%E4%B8%AD%E9%97%B4%E5%85%83%E7%B4%A0%E2%80%9D%EF%BC%8C%E5%BD%93n%E4%B8%BA%E5%A5%87%E6%95%B0%E6%97%B6%EF%BC%8C%E4%B8%AD%E4%BD%8D%E6%95%B0%E6%98%AF%E5%94%AF%E4%B8%80%E7%9A%84%EF%BC%8C%E5%87%BA%E7%8E%B0%E4%BD%8D%E7%BD%AE%E4%B8%BAn%2F2%EF%BC%9B%E5%BD%93n%E4%B8%BA%E5%81%B6%E6%95%B0%E6%97%B6%E5%80%99%EF%BC%8C%E5%AD%98%E5%9C%A8%E4%B8%A4%E4%B8%AA%E4%B8%AD%E4%BD%8D%E6%95%B0%EF%BC%8C%E4%BD%8D%E7%BD%AE%E5%88%86%E5%88%AB%E4%B8%BAn%2F2%EF%BC%88%E4%B8%8A%E4%B8%AD%E4%BD%8D%E6%95%B0%EF%BC%89%E5%92%8Cn%2F2%2B1%EF%BC%88%E4%B8%8B%E4%B8%AD%E4%BD%8D%E6%95%B0%EF%BC%89%E3%80%82. "面试官提到的顺序统计学")

浙公网安备 33010602011771号