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中asyncore的用法实例
Sep 29 Python
Python 抓取动态网页内容方案详解
Dec 25 Python
Python中AND、OR的一个使用小技巧
Feb 18 Python
python实现将html表格转换成CSV文件的方法
Jun 28 Python
Python使用Mechanize模块编写爬虫的要点解析
Mar 31 Python
python写入并获取剪切板内容的实例
May 31 Python
Python 中的range(),以及列表切片方法
Jul 02 Python
Python3远程监控程序的实现方法
Jul 15 Python
对Pytorch神经网络初始化kaiming分布详解
Aug 18 Python
Jupyter Notebook输出矢量图实例
Apr 14 Python
python Socket网络编程实现C/S模式和P2P
Jun 22 Python
python简单利用字典破解zip文件口令
Sep 07 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
php4的session功能评述(三)
2006/10/09 PHP
php GUID生成函数和类
2014/03/10 PHP
php线性表的入栈与出栈实例分析
2015/06/12 PHP
js 复制或插入Html的实现方法小结
2010/05/19 Javascript
JavaScript instanceof 的使用方法示例介绍
2013/10/23 Javascript
jQuery解决input元素的blur事件和其他非表单元素的click事件冲突问题
2016/08/15 Javascript
AngularJS实现根据变量改变动态加载模板的方法
2016/11/04 Javascript
Node.js连接postgreSQL并进行数据操作
2016/12/18 Javascript
原生js实现倒计时功能(多种格式调用)
2017/01/12 Javascript
jQuery表单验证之密码确认
2017/05/22 jQuery
vue动态配置模板 'component is'代码
2019/07/04 Javascript
autojs 蚂蚁森林能量自动拾取即给指定好友浇水的实现方法
2020/05/03 Javascript
查看Python安装路径以及安装包路径小技巧
2015/04/28 Python
python中threading超线程用法实例分析
2015/05/16 Python
Python程序中设置HTTP代理
2016/11/06 Python
python 如何快速找出两个电子表中数据的差异
2017/05/26 Python
python正则实现提取电话功能
2018/02/24 Python
pandas.DataFrame 根据条件新建列并赋值的方法
2018/04/08 Python
Python面向对象之类和对象实例详解
2018/12/10 Python
python+opencv实现高斯平滑滤波
2020/07/21 Python
python 动态生成变量名以及动态获取变量的变量名方法
2019/01/20 Python
Python实现监控Nginx配置文件的不同并发送邮件报警功能示例
2019/02/26 Python
用Python徒手撸一个股票回测框架搭建【推荐】
2019/08/05 Python
pyecharts调整图例与各板块的位置间距实例
2020/05/16 Python
Python3爬虫中Splash的知识总结
2020/07/10 Python
纯CSS3实现绘制各种图形实现代码详细整理
2012/12/26 HTML / CSS
Omio法国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/13 全球购物
西班牙美妆电商:Perfume’s Club(有中文站)
2018/08/08 全球购物
六年级数学教学反思
2014/02/03 职场文书
个人承诺书
2014/03/26 职场文书
离婚协议书标准格式
2014/10/04 职场文书
自主招生推荐信怎么写
2015/03/26 职场文书
如何在centos上使用yum安装rabbitmq-server
2021/03/31 Servers
Python编程源码报错解决方法总结经验分享
2021/10/05 Python
教你修复 Win11应用商店加载空白问题
2021/12/06 数码科技
使用Bandicam录制鼠标指针并附带点击声音,还可以添加点击动画效果
2022/04/11 数码科技