第k小、top k问题

通用思想

第k大(小)、TOP K问题都可以用++堆++来解决。第k大、最大的TOP K建小根堆Java中优先队列就是小根堆。首先将前 k 个数插入小根堆中,随后从第 k+1 个数开始遍历,如果当前遍历到的数比小根堆的堆顶的数要大,就把堆顶的数弹出,再插入当前遍历到的数。最后将小根堆里的数存入数组返回即可。

当然,更笨的方法是,对于求第k小、top k小的问题,将所有的元素构建一个最小堆,然后按照堆排序的办法,弹出交换k次,这种不采用,因为空间要求太大。

也可以用快速排序的分割思路

例外

对于有些有明显的大小顺序进入的问题,求第k小,便可以直接构建最小堆,不规定堆的大小,往堆中压入k次,即可得到答案。

例如264. 丑数 II786. 第 K 个最小的素数分数

显示 Gitment 评论