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 之编写简单乘法运算题
Feb 27 Python
Python减少循环层次和缩进的技巧分析
Mar 15 Python
django开发之settings.py中变量的全局引用详解
Mar 29 Python
解读python logging模块的使用方法
Apr 17 Python
Python 读取指定文件夹下的所有图像方法
Apr 27 Python
Python设计模式之观察者模式原理与用法详解
Jan 16 Python
Python判断对象是否相等及eq函数的讲解
Feb 25 Python
Django 中间键和上下文处理器的使用
Mar 17 Python
PyQt5 对图片进行缩放的实例
Jun 18 Python
超简单的Python HTTP服务
Jul 22 Python
如何解决flask修改静态资源后缓存文件不能及时更改问题
Aug 02 Python
完美处理python与anaconda环境变量的冲突问题
Apr 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
10条PHP编程习惯助你找工作
2008/09/29 PHP
php数组函数序列之array_combine() - 数组合并函数使用说明
2011/10/29 PHP
如何解决PHP使用mysql_query查询超大结果集超内存问题
2016/03/14 PHP
一个符号插入器 中用到的js代码
2007/09/04 Javascript
收集的10个免费的jQuery相册
2011/02/26 Javascript
潜说js对象和数组
2011/05/25 Javascript
JS+CSS制作DIV层可(最小化/拖拽/排序)功能实现代码
2013/02/25 Javascript
Jquery模仿Baidu、Google搜索时自动补充搜索结果提示
2013/12/26 Javascript
返回顶部按钮响应滚动且动态显示与隐藏
2014/10/14 Javascript
jQuery实现带延迟的二级tab切换下拉列表效果
2015/09/01 Javascript
node.js cookie-parser 中间件介绍
2016/06/06 Javascript
javascript时间戳和日期字符串相互转换代码(超简单)
2016/06/22 Javascript
request请求获取参数的实现方法(post和get两种方式)
2016/09/27 Javascript
网站申请不到支付宝接口、微信接口,免接口收款实现方式几种解决办法
2016/12/14 Javascript
JS实现获取汉字首字母拼音、全拼音及混拼音的方法
2017/11/14 Javascript
vue.js使用watch监听路由变化的方法
2018/07/08 Javascript
Vue 实现点击空白处隐藏某节点的三种方式(指令、普通、遮罩)
2019/10/23 Javascript
Javascript基于OOP实实现探测器功能代码实例
2020/08/26 Javascript
mapboxgl实现带箭头轨迹线的代码
2021/01/04 Javascript
[01:00:14]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第三场
2018/04/10 DOTA
零基础写python爬虫之抓取百度贴吧代码分享
2014/11/06 Python
Python获取Windows或Linux主机名称通用函数分享
2014/11/22 Python
Python3.5 处理文本txt,删除不需要的行方法
2018/12/10 Python
使用python turtle画高达
2020/01/19 Python
Python爬取365好书中小说代码实例
2020/02/28 Python
如何在mac版pycharm选择python版本
2020/07/21 Python
Python descriptor(描述符)的实现
2020/11/15 Python
HTML5 canvas基本绘图之绘制线段
2016/06/27 HTML / CSS
银行反四风对照检查材料
2014/09/29 职场文书
工作检讨书500字
2014/10/19 职场文书
2015年幼儿园保育员工作总结
2015/04/23 职场文书
学校通报表扬范文
2015/05/04 职场文书
研究生论文答辩开场白
2015/05/27 职场文书
机器人总动员观后感
2015/06/09 职场文书
TypeScript 使用 Tuple Union 声明函数重载
2022/04/07 Javascript
JavaScript parseInt0.0000005打印5原理解析
2022/07/23 Javascript