《剑指offer》最小的k个数

本题来自《剑指offer》 反转链表

题目:

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

思路:

   python的思路:由于python具有强大的库,所以较为方便,才有临时存储前k个值,遍历过程中将最大的值去掉,python有个max和min方法,能够直接得到一个数组中的值。将最小的前k个值保存起来,到最后将这些值排序即可。

  C++思路:思路和python的一致,都是定义k个临时存储空间,在临时存储空间中提取最大值,才用最大堆的方式,那样时间效率便是nlogk。

  这种思路不用修改原始的数据,并且能够用于海量的数据。

C++ Code:(将提取最大值方法改为最大堆方式即可)

Python Code:

# -*- coding:utf-8 -*-
class Solution:
    def GetLeastNumbers_Solution(self, tinput, k):
        # write code here
        if k > len(tinput)or k == 0:                #边界条件判断
            return []
        result = []                                 #最终的结果值
        temp = []                                   #临时存储k个值
        for i in range(k):                          #将前k个值临时存储
            temp.append(tinput[i])        
        for index in range(k,len(tinput)):          #从第k个开始到遍历
            max_num = max(temp)                     #前k个值中最大的一个
            if tinput[index] <= max_num:            #如果当前的值小于临时存储的前k个值
                temp.remove(max_num)                #那么将其替换,临时中最大的值去掉将当前值存储
                temp.append(tinput[index])
        while len(temp)>0:
            min_num = min(temp)                     #上个循环遍历完毕情况下,对临时前k个值进行排序
            result.append(min_num)
            temp.remove(min_num)
        return result

总结:

原文地址:https://www.cnblogs.com/missidiot/p/10783657.html