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编写脚本获取手机当前应用apk的信息
Jul 21 Python
Python的__builtin__模块中的一些要点知识
May 02 Python
Python 中的 else详解
Apr 23 Python
PyQt5每天必学之拖放事件
Aug 27 Python
python3学习之Splash的安装与实例教程
Jul 09 Python
Django如何防止定时任务并发浅析
May 14 Python
Pytorch训练过程出现nan的解决方式
Jan 02 Python
浅谈pycharm导入pandas包遇到的问题及解决
Jun 01 Python
Keras 加载已经训练好的模型进行预测操作
Jun 17 Python
python openCV实现摄像头获取人脸图片
Aug 20 Python
python re的findall和finditer的区别详解
Nov 15 Python
使用Python开发贪吃蛇游戏 SnakeGame
Apr 30 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
PHP6 中可能会出现的新特性预览
2014/04/04 PHP
PHP制作万年历
2015/01/07 PHP
Zend Framework教程之路由功能Zend_Controller_Router详解
2016/03/07 PHP
Laravel5.7 数据库操作迁移的实现方法
2019/04/12 PHP
妙用Jquery的val()方法
2012/06/27 Javascript
Javascript实现简单二级下拉菜单实例
2014/06/15 Javascript
使用JQuery库提供的扩展功能实现自定义方法
2014/09/09 Javascript
ES6新特性之变量和字符串用法示例
2017/04/01 Javascript
通俗易懂地解释JS中的闭包
2017/10/23 Javascript
Three.js加载外部模型的教程详解
2017/11/10 Javascript
vue实现文章内容过长点击阅读全文功能的实例
2017/12/28 Javascript
详解vue+vuex+koa2开发环境搭建及示例开发
2018/01/22 Javascript
在Vue组件中使用 TypeScript的方法
2018/02/28 Javascript
vuex如何重置所有state(可定制)
2019/01/17 Javascript
vue中实现Monaco Editor自定义提示功能
2019/07/05 Javascript
vue中 数字相加为字串转化为数值的例子
2019/11/07 Javascript
[45:16]完美世界DOTA2联赛循环赛 IO vs FTD BO2第二场 11.05
2020/11/06 DOTA
python发送邮件的实例代码(支持html、图片、附件)
2013/03/04 Python
Python程序设计入门(4)模块和包
2014/06/16 Python
状态机的概念和在Python下使用状态机的教程
2015/04/11 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
2018/02/01 Python
在Python中过滤Windows文件名中的非法字符方法
2019/06/10 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
2019/07/24 Python
Django中的session用法详解
2020/03/09 Python
python 负数取模运算实例
2020/06/03 Python
python基于opencv 实现图像时钟
2021/01/04 Python
全球第二大家装零售商:Lowe’s
2018/01/13 全球购物
租车协议书范本
2014/04/22 职场文书
学习张丽丽心得体会
2014/09/03 职场文书
初级党校心得体会
2014/09/11 职场文书
2014年平安创建工作总结
2014/11/24 职场文书
经典搞笑版检讨书
2015/02/19 职场文书
MySQL主从复制断开的常用修复方法
2021/04/07 MySQL
golang 在windows中设置环境变量的操作
2021/04/29 Golang
Windows Server 2008配置防火墙策略详解
2022/06/28 Servers
MySQL数据库查询之多表查询总结
2022/08/05 MySQL