Python实现查找最小的k个数示例【两种解法】


Posted in Python onJanuary 08, 2019

本文实例讲述了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定时采集摄像头图像上传ftp服务器功能实现
Dec 23 Python
python中assert用法实例分析
Apr 30 Python
详解Python的Twisted框架中reactor事件管理器的用法
May 25 Python
Python如何判断数独是否合法
Sep 08 Python
Python编程之变量赋值操作实例分析
Jul 24 Python
python实现简易版计算器
Jun 22 Python
Python后台开发Django会话控制的实现
Apr 15 Python
在python中用print()输出多个格式化参数的方法
Jul 16 Python
python实现网站用户名密码自动登录功能
Aug 09 Python
Python实现多线程/多进程的TCP服务器
Sep 03 Python
Python selenium页面加载慢超时的解决方案
Mar 18 Python
python3.7+selenium模拟淘宝登录功能的实现
May 26 Python
对Python闭包与延迟绑定的方法详解
Jan 07 #Python
python将控制台输出保存至文件的方法
Jan 07 #Python
对Python捕获控制台输出流的方法详解
Jan 07 #Python
python print输出延时,让其立刻输出的方法
Jan 07 #Python
Python3 单行多行万能正则匹配方法
Jan 07 #Python
Python字符串的全排列算法实例详解
Jan 07 #Python
Python 3.3实现计算两个日期间隔秒数/天数的方法示例
Jan 07 #Python
You might like
PHP 加密解密内部算法
2010/04/22 PHP
基于header的一些常用指令详解
2013/06/06 PHP
PHP处理数组和XML之间的互相转换
2016/06/02 PHP
yii2 RBAC使用DbManager实现后台权限判断的方法
2016/07/23 PHP
PHP实现图片防盗链破解操作示例【解决图片防盗链问题/反向代理】
2020/05/29 PHP
统一接口:为FireFox添加IE的方法和属性的js代码
2007/03/25 Javascript
javascript获得服务器端控件的ID的实现代码
2011/12/28 Javascript
js 单击式的下拉菜单效果实例
2013/08/13 Javascript
js触发select onchange事件的小技巧
2014/08/05 Javascript
JQuery boxy插件在IE中边角图片不显示问题的解决
2015/05/20 Javascript
javascript跨域的方法汇总
2015/10/23 Javascript
Node.js实现JS文件合并小工具
2016/02/02 Javascript
BootStrap点击下拉菜单项后显示一个新的输入框实现代码
2016/05/16 Javascript
NodeJS实现微信公众号关注后自动回复功能
2017/05/31 NodeJs
Vue组件库发布到npm详解
2018/02/17 Javascript
angular中两种表单的区别(响应式和模板驱动表单)
2018/12/06 Javascript
JavaScript禁用右键单击优缺点分析
2019/01/20 Javascript
Elementui表格组件+sortablejs实现行拖拽排序的示例代码
2019/08/28 Javascript
vue源码中的检测方法的实现
2019/09/26 Javascript
NodeJS实现一个聊天室功能
2019/11/25 NodeJs
[01:00:11]DOTA2-DPC中国联赛 正赛 CDEC vs DLG BO3 第一场 2月7日
2021/03/11 DOTA
python encode和decode的妙用
2009/09/02 Python
Python实现对PPT文件进行截图操作的方法
2015/04/28 Python
在阿里云服务器上配置CentOS+Nginx+Python+Flask环境
2016/06/18 Python
Python数据结构之翻转链表
2017/02/25 Python
python 中pyqt5 树节点点击实现多窗口切换问题
2019/07/04 Python
python 爬虫 实现增量去重和定时爬取实例
2020/02/28 Python
python用Configobj模块读取配置文件
2020/09/26 Python
python 发送邮件的示例代码(Python2/3都可以直接使用)
2020/12/03 Python
澳大利亚波希米亚风时尚品牌:Tree of Life
2019/09/15 全球购物
介绍一下Make? 为什么使用make
2013/12/08 面试题
法律工作求职自荐信
2013/10/31 职场文书
上课睡觉检讨书300字
2014/11/18 职场文书
2015年党支部书记工作总结
2015/05/21 职场文书
小学二年级班主任工作经验交流材料
2015/11/02 职场文书
2019求职信:应届生求职信范文
2019/04/24 职场文书