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正则表达式判断字符串是否是全部小写示例
Dec 25 Python
python进阶教程之函数对象(函数也是对象)
Aug 30 Python
Python中threading模块join函数用法实例分析
Jun 04 Python
Linux下为不同版本python安装第三方库
Aug 31 Python
Python WXPY实现微信监控报警功能的代码
Oct 20 Python
Python获取系统所有进程PID及进程名称的方法示例
May 24 Python
python实现txt文件格式转换为arff格式
May 31 Python
python使用PIL给图片添加文字生成海报示例
Aug 17 Python
pygame实现非图片按钮效果
Oct 29 Python
Python内置函数property()如何使用
Sep 01 Python
浅谈Python数学建模之线性规划
Jun 23 Python
Python绘制散点图之可视化神器pyecharts
Jul 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
php中隐形字符65279(utf-8的BOM头)问题
2014/08/16 PHP
destoon首页调用求购供应信息的地区名称的方法
2014/08/21 PHP
JavaScript实现Sleep函数的代码
2007/03/04 Javascript
setAttribute 与 class冲突解决
2008/02/17 Javascript
IE7中javascript操作CheckBox的checked=true不打勾的解决方法
2009/12/07 Javascript
为什么要在引入的css或者js文件后面加参数的详细讲解
2013/05/03 Javascript
在Iframe中获取父窗口中表单的值(示例代码)
2013/11/22 Javascript
Jquery操作js数组及对象示例代码
2014/05/11 Javascript
JavaScript控制网页层收起和展开效果的方法
2015/04/15 Javascript
ANGULARJS中使用JQUERY分页控件
2015/09/16 Javascript
layui的表单验证支持ajax判断用户名是否重复的实例
2019/09/06 Javascript
javascript绘制简单钟表效果
2020/04/07 Javascript
vue+iview使用树形控件的具体使用
2020/11/02 Javascript
[02:43]DOTA2亚洲邀请赛场馆攻略——带你走进东方体育中心
2018/03/19 DOTA
使用Python脚本将文字转换为图片的实例分享
2015/08/29 Python
python实现给微信公众号发送消息的方法
2017/06/30 Python
Python使用struct处理二进制的实例详解
2017/09/11 Python
Flask之flask-script模块使用
2018/07/26 Python
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
2018/11/30 Python
python实现将json多行数据传入到mysql中使用
2019/12/31 Python
详解Python的三种拷贝方式
2020/02/11 Python
基于python3的socket聊天编程
2020/02/17 Python
手把手教你安装Windows版本的Tensorflow
2020/03/26 Python
Python json解析库jsonpath原理及使用示例
2020/11/25 Python
Python的logging模块基本用法
2020/12/24 Python
css3实现文字扫光渐变动画效果的示例
2017/11/07 HTML / CSS
Giuseppe Zanotti美国官方网站:将鞋履视为高级时装般精心制作
2018/02/06 全球购物
电信专业应届生自荐信
2013/09/28 职场文书
网站创业计划书
2014/04/30 职场文书
党员三严三实对照检查材料
2014/10/13 职场文书
二年级语文上册复习计划
2015/01/19 职场文书
民主生活会意见
2015/06/05 职场文书
2015年暑期见闻
2015/07/14 职场文书
优秀班干部主要事迹材料
2015/11/04 职场文书
Mysql Online DDL的使用详解
2021/05/20 MySQL
Java 关于String字符串原理上的问题
2022/04/07 Java/Android