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创建和使用字典实例详解
Nov 01 Python
基于Django与ajax之间的json传输方法
May 29 Python
Python2.7环境Flask框架安装简明教程【已测试】
Jul 13 Python
Python读取txt某几列绘图的方法
Oct 14 Python
pycharm 将python文件打包为exe格式的方法
Jan 16 Python
python根据文章标题内容自动生成摘要的实例
Feb 21 Python
eclipse创建python项目步骤详解
May 10 Python
Django ORM 查询管理器源码解析
Aug 05 Python
利用Python脚本批量生成SQL语句
Mar 04 Python
Python3-异步进程回调函数(callback())介绍
May 02 Python
Python+OpenCV检测灯光亮点的实现方法
Nov 02 Python
Pycharm-community-2020.2.3 社区版安装教程图文详解
Dec 08 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
Codeigniter发送邮件的方法
2015/03/19 PHP
PHP aes (ecb)解密后乱码问题
2015/06/22 PHP
Zend Framework教程之Zend_Db_Table_Row用法实例分析
2016/03/21 PHP
PHP设计模式之模板方法模式定义与用法详解
2018/04/02 PHP
解决PhpStorm64不能启动的问题
2020/06/20 PHP
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
2014/09/26 NodeJs
javascript实现数独解法
2015/03/14 Javascript
老生常谈JavaScript 正则表达式语法
2016/08/20 Javascript
聊一聊JS中的prototype
2016/09/29 Javascript
在js中实现邮箱格式的验证方法(推荐)
2016/10/24 Javascript
详解Vue 2.0封装axios笔记
2017/06/22 Javascript
bootstrap时间插件daterangepicker使用详解
2017/10/19 Javascript
Vue下拉框回显并默认选中随机问题
2018/09/06 Javascript
Vue项目中最新用到的一些实用小技巧
2018/11/06 Javascript
jquery中为什么能用$操作
2019/06/18 jQuery
小程序双头slider选择器的实现示例
2020/03/31 Javascript
python将html转成PDF的实现代码(包含中文)
2013/03/04 Python
django如何连接已存在数据的数据库
2018/08/14 Python
Python从使用线程到使用async/await的深入讲解
2018/09/16 Python
python实现连续图文识别
2018/12/18 Python
Python并发:多线程与多进程的详解
2019/01/24 Python
对Python3中dict.keys()转换成list类型的方法详解
2019/02/03 Python
解决python线程卡死的问题
2019/02/18 Python
使用Python检测文章抄袭及去重算法原理解析
2019/06/14 Python
在OpenCV里使用Camshift算法的实现
2019/11/22 Python
英国假睫毛购买网站:FalseEyelashes.co.uk
2018/05/23 全球购物
文秘专业毕业生就业推荐信
2013/11/08 职场文书
大学本科毕业生求职信范文
2013/12/18 职场文书
致1500米运动员广播稿
2014/02/07 职场文书
优秀员工演讲稿
2014/05/19 职场文书
综合素质自我评价怎么写
2014/09/14 职场文书
2014年保洁工作总结
2014/11/24 职场文书
三八红旗手事迹材料
2014/12/26 职场文书
人身损害赔偿协议书
2016/03/22 职场文书
2016年机关单位节能宣传周活动总结
2016/04/05 职场文书
Vscode中SSH插件如何远程连接Linux
2022/05/02 Servers