算法试题 - 找出最小 k 个数

Posted shijieli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法试题 - 找出最小 k 个数相关的知识,希望对你有一定的参考价值。

题目

题目:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

解析

思路1

这一题应用堆排序算法复杂度只有O(nlog k),堆是完全二叉树的一种,最大堆就是最上面的数是最大的
该方法基于二叉树或者堆来实现,首先把数组前k个数字构建一个最大堆,然后从第k+1个数字开始遍历数组,如果遍历到的
元素小于堆顶的数字,那么久将换两个数字,重新构造堆,继续遍历,最后剩下的堆就是最小的k个数,时间复杂度O(nlog k)。

思路2

排序 + 切片

答案

标准答案

# -*- coding:utf-8 -*-
class Solution:
    def GetLeastNumbers_Solution(self, tinput, k):
        # write code here、
        import heapq
        if tinput == None or len(tinput) < k or len(tinput) <= 0 or k <= 0:
            return []

        # 建立最小堆,最上面那个数是最小的,返回一个列表,这个列表就是从最小值开始的k个数
        return heapq.nsmallest(k, tinput)


# -*- coding:utf-8 -*-
class Solution:
    def GetLeastNumbers_Solution(self, tinput, k):
        # write code here、
        import heapq
        if tinput == None or len(tinput) < k or len(tinput) <= 0 or k <= 0:
            return []

        return sorted(tinput)[:k]

自我实现代码

li = [1, 5, 6, 8, 92, 3, 23]


class Findmixknums:
    def __init__(self, li, k):
        self.li = li
        self.k = k

    def findknum(self):
        return sorted(self.li)[:self.k]


findknum = Findmixknums(li, 3)
print(findknum.findknum())

 

以上是关于算法试题 - 找出最小 k 个数的主要内容,如果未能解决你的问题,请参考以下文章

算法试题 - 找出一个序列中出现频率最高的三个数

数组中找出最小的K个数

⭐算法入门⭐《堆》简单01 —— LeetCode 剑指 Offer 40. 最小的k个数

算法剑指 Offer 40. 最小的k个数 重刷

小米笔试题:无序数组中最小的k个数

剑指offer--最小的K个数