数组(1)——寻找最小的k个数

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaojie_570/article/details/87643905

题目描述

有 n 个整数,请找出其中最小的 k 个数,要求时间复杂度尽可能低。

解法

使用堆

  • 【步骤一】用容量为k的最大堆存储最先遍历到的k 个数,假设它们就是最小的k 个数,建堆的时候耗时:O(k),建好堆之后堆中的元素是有序的。
  • 【步骤二】遍历剩余的 n-k 个数。假设每次遍历到的新元素的值为 x,把 x 与堆顶元素 kmax 进行比较:如果 x < kmax, 用x 替换 kmax,然后更新堆(用时 O(logk));否则不更新堆。

这样下来,如果【步骤二】中每遍历剩余的 n-k 个数中的每一个数都要调整堆,那么将得到最坏情况下的时间复杂度:

O(k + (n-k)logk) = O(nlogk)

如果建堆和更新堆不是很清楚的话,可以参考:https://blog.csdn.net/xiaojie_570/article/details/87643336

猜你喜欢

转载自blog.csdn.net/xiaojie_570/article/details/87643905
今日推荐