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 OS模块常用函数说明
May 23 Python
python 的列表遍历删除实现代码
Apr 12 Python
Python 实现简单的shell sed替换功能(实例讲解)
Sep 29 Python
浅析PHP与Python进行数据交互
May 15 Python
pandas 空的dataframe 插入列名的示例
Oct 30 Python
Python 加密与解密小结
Dec 06 Python
对python3中, print横向输出的方法详解
Jan 28 Python
Python代码实现删除一个list里面重复元素的方法
Apr 02 Python
Python 获取numpy.array索引值的实例
Dec 06 Python
Python + Requests + Unittest接口自动化测试实例分析
Dec 12 Python
Python实现汇率转换操作
May 03 Python
python实现剪贴板的操作
Jul 01 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
phpwind中的数据库操作类
2007/01/02 PHP
PHP 变量定义和变量替换的方法
2009/07/30 PHP
PHP采用curl模仿用户登陆新浪微博发微博的方法
2014/11/07 PHP
php 二维数组时间排序实现代码
2016/11/19 PHP
jquery select选中的一个小问题
2009/10/11 Javascript
JQuery 确定css方框模型(盒模型Box Model)
2010/01/22 Javascript
jqPlot 基于jquery的画图插件
2011/04/26 Javascript
js,jQuery 排序的实现代码,网页标签排序的实现,标签排序
2011/04/27 Javascript
仅IE不支持setTimeout/setInterval函数的第三个以上参数
2011/05/25 Javascript
xmlhttp缓存清除的2种解决方法
2013/12/13 Javascript
javascript从image转换为base64位编码的String
2014/07/29 Javascript
基于JavaScript实现通用tab选项卡(通用性强)
2016/01/07 Javascript
JQuery实现列表中复选框全选反选功能封装(推荐)
2016/11/24 Javascript
微信小程序 传值取值的几种方法总结
2017/01/16 Javascript
详解如何去除vue项目中的#——History模式
2017/10/13 Javascript
微信小程序rich-text富文本用法实例分析
2019/05/20 Javascript
详解vue中v-on事件监听指令的基本用法
2020/07/22 Javascript
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
2020/08/05 Javascript
vue 实现click同时传入事件对象和自定义参数
2021/01/29 Vue.js
python通过pil模块获得图片exif信息的方法
2015/03/16 Python
matplotlib设置legend图例代码示例
2017/12/19 Python
详解appium+python 启动一个app步骤
2017/12/20 Python
python中sys.argv函数精简概括
2018/07/08 Python
不管你的Python报什么错,用这个模块就能正常运行
2018/09/14 Python
python实现基于朴素贝叶斯的垃圾分类算法
2019/07/09 Python
python3 批量获取对应端口服务的实例
2019/07/25 Python
python exit出错原因整理
2020/08/31 Python
python中@property的作用和getter setter的解释
2020/12/22 Python
CSS3媒体查询(Media Queries)介绍
2013/09/12 HTML / CSS
elf彩妆英国官网:e.l.f. Cosmetics英国(美国平价彩妆品牌)
2017/11/02 全球购物
竞聘上岗演讲稿
2014/05/16 职场文书
公司应聘自荐书
2014/06/14 职场文书
党员身份证明材料
2015/06/19 职场文书
终止合同协议书范本
2016/03/22 职场文书
Golang二维切片初始化的实现
2021/04/08 Golang
详解nginx安装过程并代理下载服务器文件
2022/02/12 Servers