《剑指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