【面试常考算法】经典的 Top K 问题

输出最小的k个数

方法一:排序
对原数组从小到大排序后取出前k个数即可。直接调用sort函数

def smallestK(a,k):
    a.sort()
    return a[:k]

方法二:堆
用一个大根堆实时维护数组的前k小值。首先将k个数插入大根堆中,随后从第k+1个数开始遍历,如果当前遍历到的数比大根堆的堆顶的数要小,就把堆顶的数弹出,再插入到当前遍历到的数。最后将大根堆里的数存入数组返回即可。

利用python中的heapq模块。heapify只能维护一个小堆根,故要取负数。

def smallestK(a,k):
    if k==0:
       return list
    hp=[-x for x in a[:k]]
    heapq.heapify(hp)
    for i in range(k,len(a)):
        if -hp[0]>a[i]:
            heapq.heappop(hp)
            heapq.heappush(hp,-a[i])
    return [-x for x in hp]

方法三:快排
快排结束,进行数据划分,假设这个数属于第t个
t==k,那么返回前t个;
t > k,那么问题规模缩小为在前面t-1个数找k个;
t < k,说明已经确定前t个数属于前k个,但是第t+1到k这些数还没确定,那么问题规模缩小为从t+1到右边界找k-t个数

def QuickSort(arr,l,r,k):
    i,j=l,r
    if l>=r or k==0:return arr
    while i<j:
        while i<j and arr[j]>=arr[l]:j-=1
        while i<j and arr[i]<=arr[l]:i+=1
        arr[i],arr[j]=arr[j],arr[i]
    arr[l],arr[i]=arr[i],arr[l]
    if k==i:return arr[:i]
    elif k<i:QuickSort(arr,0,i-1,k)
    else:
        QuickSort(arr,i+1,r,k)
    return arr[:k]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值