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中使用Mako模版库的简单教程
Apr 08 Python
简单了解Python中的几种函数
Nov 03 Python
python二维列表一维列表的互相转换实例
Jul 02 Python
python 通过可变参数计算n个数的乘积方法
Jun 13 Python
Python画图高斯分布的示例
Jul 10 Python
Python使用import导入本地脚本及导入模块的技巧总结
Aug 07 Python
Python3.0 实现决策树算法的流程
Aug 08 Python
python 根据网易云歌曲的ID 直接下载歌曲的实例
Aug 24 Python
DJango的创建和使用详解(默认数据库sqlite3)
Nov 18 Python
Python 内置变量和函数的查看及说明介绍
Dec 25 Python
使用keras实现非线性回归(两种加激活函数的方式)
Jul 05 Python
详解pytorch tensor和ndarray转换相关总结
Sep 03 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代码DOS造成用光网络带宽
2011/03/01 PHP
PHP操作Memcache实例介绍
2013/06/14 PHP
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
2014/07/22 PHP
LINUX下PHP程序实现WORD文件转化为PDF文件的方法
2016/05/13 PHP
phpQuery采集网页实现代码实例
2020/04/02 PHP
[原创]图片分页查看
2006/08/28 Javascript
使用javascipt---实现二分查找法
2013/04/10 Javascript
一个简单的动态加载js和css的jquery代码
2014/09/01 Javascript
javascript中Math.random()使用详解
2015/04/15 Javascript
原生JS实现美图瀑布流布局赏析
2015/09/07 Javascript
用jmSlip编写移动端顶部日历选择控件
2016/10/24 Javascript
基于Bootstrap的Java开发问题汇总(Spring MVC)
2017/01/15 Javascript
Vue组件开发之LeanCloud带图形校验码的短信发送功能
2017/11/07 Javascript
vue 中基于html5 drag drap的拖放效果案例分析
2018/11/01 Javascript
[03:17]2014DOTA2 国际邀请赛中国区预选赛 四强专访
2014/05/23 DOTA
Python多线程编程(七):使用Condition实现复杂同步
2015/04/05 Python
将Django使用的数据库从MySQL迁移到PostgreSQL的教程
2015/04/11 Python
用于统计项目中代码总行数的Python脚本分享
2015/04/21 Python
Windows下python3.6.4安装教程
2018/07/31 Python
Tensorflow使用支持向量机拟合线性回归
2018/09/07 Python
python直接获取API传递回来的参数方法
2018/12/17 Python
简单了解python gevent 协程使用及作用
2019/07/22 Python
CSS3 对过渡(transition)进行调速以及延时
2020/10/21 HTML / CSS
canvas 橡皮筋式线条绘图应用方法
2019/02/13 HTML / CSS
澳大利亚票务和娱乐市场领导者:Ticketmaster
2017/03/03 全球购物
罗马尼亚在线杂货店:Pilulka.ro
2019/09/28 全球购物
Wolford法国官网:奥地利奢侈内衣品牌
2020/08/11 全球购物
Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
2012/06/05 面试题
竞聘上岗演讲稿范文
2014/01/10 职场文书
自我评价的范文
2014/02/02 职场文书
挂职自我鉴定
2014/02/26 职场文书
企业新年寄语
2014/04/04 职场文书
群众路线教育查摆剖析材料
2014/10/10 职场文书
Html5页面播放M4a音频文件
2021/03/30 HTML / CSS
Vue的列表之渲染,排序,过滤详解
2022/02/24 Vue.js
正则表达式基础与常用验证表达式
2022/06/16 Javascript