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获取Linux下文件版本信息、公司名和产品名的方法
Oct 05 Python
Python检测QQ在线状态的方法
May 09 Python
python爬取NUS-WIDE数据库图片
Oct 05 Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
Jan 20 Python
Anaconda入门使用总结
Apr 05 Python
PyQt5实现拖放功能
Apr 25 Python
pandas.loc 选取指定列进行操作的实例
May 18 Python
numpy判断数值类型、过滤出数值型数据的方法
Jun 09 Python
python实现抖音视频批量下载
Jun 20 Python
在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
Jun 18 Python
浅谈Python中的继承
Jun 19 Python
用python写一个带有gui界面的密码生成器
Nov 06 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中url函数介绍及使用示例
2014/02/13 PHP
phpword插件导出word文件时中文乱码问题处理方案
2014/08/19 PHP
phpstorm编辑器乱码问题解决
2014/12/01 PHP
yii2实现Ueditor百度编辑器的示例代码
2018/11/02 PHP
JS实现仿QQ聊天窗口抖动特效
2015/05/10 Javascript
JS基于cookie实现来宾统计记录访客信息的方法
2015/08/04 Javascript
深入浅析同源策略和跨域访问
2015/11/26 Javascript
Bootstrap每天必学之媒体对象
2015/11/30 Javascript
基于MVC4+EasyUI的Web开发框架形成之旅之界面控件的使用
2015/12/16 Javascript
AngularJS向后端ASP.NET API控制器上传文件
2016/02/03 Javascript
jQuery实现百叶窗焦点图动画效果代码分享(附源码下载)
2016/03/14 Javascript
Vue.js组件tabs实现选项卡切换效果
2016/12/01 Javascript
javascript显示系统当前时间代码
2016/12/29 Javascript
vue select组件的使用与禁用实现代码
2018/04/10 Javascript
浅谈Vue组件及组件的注册方法
2018/08/24 Javascript
微信小程序实现图片滚动效果示例
2018/12/05 Javascript
微信小程序动态显示项目倒计时
2019/06/20 Javascript
webpack的 rquire.context用法实现工程自动化的方法
2020/02/07 Javascript
VUE 实现element upload上传图片到阿里云
2020/08/12 Javascript
详解python3中socket套接字的编码问题解决
2017/07/01 Python
Python爬取当当、京东、亚马逊图书信息代码实例
2017/12/09 Python
python远程连接MySQL数据库
2019/04/19 Python
python实现动态数组的示例代码
2019/07/15 Python
英国百安居装饰建材网上超市:B&Q
2016/09/13 全球购物
加拿大探亲邀请信
2014/01/28 职场文书
教师试用期自我鉴定
2014/02/12 职场文书
计算机应用专业毕业生求职信
2014/06/03 职场文书
行政求职信
2014/07/04 职场文书
优秀教师先进个人事迹材料
2014/08/31 职场文书
入党积极分子党小组意见
2015/06/02 职场文书
酒店开业主持词
2015/07/02 职场文书
2015年国庆节寄语
2015/08/17 职场文书
2016年入党心得体会范文
2016/01/23 职场文书
2016年先进班集体事迹材料
2016/02/26 职场文书
用JS创建一个录屏功能
2021/11/11 Javascript
Python内置的数据类型及使用方法
2022/04/13 Python