求一个数组中最小的K个数

面试的时候,面试官问了这道题“求一个数组中最小的k个数”,我当时只给出了两种解法:

1. 首先使用排序,然后选择前k个值返回。这种算法最好的时间复杂度是O(nlogn),取决于所选择的排序算法

2.初始化一个k个元素的数组a,首先将数组中前k个元素放入a中,然后从K+1到最后一个元素进行如下判断:如果当前元素大于a中最大元素,继续向后遍历;如果当前元素小于a中最大元素,则替换a中最大元素.......就可以得到最小的k个数,这种算法时间复杂度可以为O(nk)。如果采用堆作为存储K个元素的容器,建堆的时间为O(k),获取堆的最大值O(1),替换最大元素后,调整堆的时间复杂度为O(logk),所以最终时间复杂度为O(nlogk),适合海量数据获取k个最大数的情况。

上面说的两种算法,面试官都不满意,等面试结束后,在网上查了一下,这就是剑指offer上面的题目。下面说一下剑指offer上面的解法。

题目并没有要求返回有序的前k个数,如数组:4,5,1,6,2,7,3,8。返回最小的4个数,结果应该为1,2,3,4(这个可以是无序的)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值