Python实现查找最小的k个数示例【两种解法】
Python  /  管理员 发布于 7年前   150
本文实例讲述了Python实现查找最小的k个数。分享给大家供大家参考,具体如下:
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
解法1
使用partition函数可以知道,使用==O(N)==的时间复杂度就可以找出第K大的数字,并且左边的数字比这个数小,右边的数字比这个数字大。因此可以取k为4,然后输出前k个数字,如果需要排序的话再对结果进行排序
# -*- coding:utf-8 -*-class Solution: def PartitionOfK(self, numbers, start, end, k): if k < 0 or numbers == [] or start < 0 or end >= len(numbers) or k > end: return low, high = start, end key = numbers[low] while low < high: while low < high and numbers[high] >= key: high -= 1 numbers[low] = numbers[high] while low < high and numbers[low] <= key: low += 1 numbers[high] = numbers[low] numbers[low] = key if low < k: self.PartitionOfK(numbers, start + 1, end, k) elif low > k: self.PartitionOfK(numbers, start, end - 1, k) def GetLeastNumbers_Solution(self, tinput, k): # write code here if k <= 0 or tinput == [] or k > len(tinput): return [] self.PartitionOfK(tinput, 0, len(tinput) - 1, k) return sorted(tinput[0:k])#测试:sol = Solution()listNum = [4,5,1,6,2,7,3,8]rel = sol.GetLeastNumbers_Solution(listNum, 4)print(rel)
运行时间:30ms
占用内存:5732k
解法2
解法1存在两个问题,一个是partition把数组的顺序改变了,第二是无法处理海量的数据,海量的数组全部导入到内存里面做partition显然是不合适的。因此可以找出结果中最大的数字,如果遍历的数字比这个数字小,则替换,否则不变,可以采用堆的形式来实现数据结构,达到O(logK)的复杂度,因此整体的时间复杂度为N*O(logK)
# -*- coding:utf-8 -*-class Solution: def GetLeastNumbers_Solution(self, tinput, k): # write code here if tinput == [] or k <= 0 or k > len(tinput): return [] result = [] for num in tinput: if len(result) < k: result.append(num) else: if num < max(result): result[result.index(max(result))] = num return sorted(result)#测试:sol = Solution()listNum = [4,5,1,6,2,7,3,8]rel = sol.GetLeastNumbers_Solution(listNum, 4)print(rel)
运行结果同上
运行时间:25ms
占用内存:5724k
时间和空间占用都比解法1更优。
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数学运算技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号