之前面试的时候硬是想不起来,面试官提醒之后才想起来自己也接触到过这样的题目。
一般都是用的堆排序,建立大小为k的大顶堆,使用前k个数直接建堆,则对顶是最大数,再使用第k+i(i=1,2,3...)个数去和堆顶做比较,小于则替换堆顶,再进行沉降,大于则跳过。这样就可以始终保持此k大小的堆为前k个数。
复杂度应该是nlogk。
今天看到算法笔记中提到使用快排也可以。
思想是选中合适基准将数据分为两段,两段大小分别为x,y,x>k时,直接抛弃第二段,否则再将第二段y大小的数据选基准分割,分割分别为y1,y2,再将y1和k-x进行比较,y1>k-x时抛弃后半段,否则在进行上面的操作...
递归的思想不断分割出k大小的数据段(累计为k),平均复杂度应该也是nlogk。取决于随机选中的基准大小了...
只是一点思想,想起来了便写下来。