通用思想
第k大(小)、TOP K问题都可以用++堆++来解决。第k大、最大的TOP K建小根堆。Java中优先队列就是小根堆。首先将前 k 个数插入小根堆中,随后从第 k+1 个数开始遍历,如果当前遍历到的数比小根堆的堆顶的数要大,就把堆顶的数弹出,再插入当前遍历到的数。最后将小根堆里的数存入数组返回即可。
当然,更笨的方法是,对于求第k小、top k小的问题,将所有的元素构建一个最小堆,然后按照堆排序的办法,弹出交换k次,这种不采用,因为空间要求太大。
也可以用快速排序的分割思路。
例外
对于有些有明显的大小顺序进入的问题,求第k小,便可以直接构建最小堆,不规定堆的大小,往堆中压入k次,即可得到答案。