topk问题:求最小或最大的k个数,求第k大或第k小的数

最近做了道算法题,题目大概意思如下:输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。题目看起来不难,但是想要比较用比较高效的算法对于我这种新手来说还是比较困难的。1.我最开始想到的是用做k轮选择排序(其实就是求k次最小值),因为选择排序有个特点就是每次都会,确定一个最小值,这样我们的时间复杂度就位 o(n * k)。2.其次我有想到直接使用快速排序,在取前k个数,这样复杂度为o(nlogn)对比了一下1,2,在k
摘要由CSDN通过智能技术生成
最近做了道算法题,题目大概意思如下:输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
题目看起来不难,但是想要比较用比较高效的算法对于我这种新手来说还是比较困难的。

1.我最开始想到的是用做k轮选择排序(其实就是求k次最小值),因为选择排序有个特点就是每次都会,确定一个最小值,这样我们的时间复杂度就位 o(n * k)。
2.其次我有想到直接使用快速排序,在取前k个数,这样复杂度为o(nlogn)

对比了一下1,2,在k < logn的时候,我们其实用方法1会比较好,在 k > logn的时候用方法2比较高效。

但是自我感觉了一下,觉得算法的复杂度还是有点高,因为我们只需要找到最小的前k个数,直接快速排序就显得有些多余了。
我想着尽量能将复杂度降到o(n),甚至log(n)。
让后想了很久也没想出来,最后从网上找到了一种比较高效的解法,它利用的是快排思想
想要了解这种算法就要非常熟悉快排。
快排的思想就是:每次找一个基准值,将数组中的其他值与基准值比较,最后,小于基准值的落在基准值左边,大于基准值的落在基准值右边。这样一轮排序过后,其实基准值的位置就已经确定下来了,由于这里主要讲解topk问题,故快速排序不在这里过多阐述。

基于快排思想的算法代码如下:

 public int[] getLeastNumbers(int[] arr, int k
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值