剑指offer刷题日记29(python)

题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

思路

第一个想法是对数组进行排序,然后返回排序之后的数组前k个数。但是这种方法需要一个长度为数组长度的空间,当数组很大时,效率不高。
因此,我们可以构建一个堆,
利用堆排序,适合处理海量数据
(1)遍历输入数组,将前k个数插入到推中;(利用heapq模块来做为堆的实现)
(2)继续从输入数组中读入元素做为待插入整数,并将它与堆中最大值比较:
如果待插入的值比当前已有的最大值小,则用这个数替换当前已有的最大值;
如果待插入的值比当前已有的最大值还大,则抛弃这个数,继续读下一个数。
这样动态维护堆中这k个数,以保证它只储存输入数组中的前k个最小的数,最后输出堆即可。这种方法只需要开辟一个长度为k的空间,大大节省了空间的消耗

代码

# -*- coding:utf-8 -*-
import heapq    # 利用python的heapq模块,来实现堆的操作
class Solution:    def GetLeastNumbers_Solution(self, tinput, k):# write code heremaxheap = []if k <= 0 or tinput == None or len(tinput)<k:return []for i in range(k):heapq.heappush(maxheap,-tinput[i])for i in range(k,len(tinput)):if maxheap[0]> -tinput[i]:continueelse:heapq.heappushpop(maxheap,-tinput[i])result = []for i in range(k):result.insert(0,-heapq.heappop(maxheap))return result

ps:heapq构造的是小顶堆,即堆顶元素最小,因此为了构造大顶堆,需要将元素都加负号,来颠倒他们的大小关系,相反数的小顶堆,就相当于原来数的大顶堆。求前K个最大的数,用小顶堆,K个小的数,用大顶堆。

@ 剑指offer(python)最小的k个数相关推荐

  1. 【LeetCode】剑指 Offer 40. 最小的k个数

    [LeetCode]剑指 Offer 40. 最小的k个数 文章目录 [LeetCode]剑指 Offer 40. 最小的k个数 一.笨比解法 二.堆排序 三.快速选择 总结 一.笨比解法 选择排序变 ...

  2. 剑指offer 40.最小的 K 个数 python代码

    题目 寻找数组中的最小的k个数,也叫topk问题. 牛客网测试地址 注意: 牛客网的提交需要将最终的结果排序 思路 快速排序的 partition() 方法,会返回一个整数 j 使得 a[l-j-1] ...

  3. 【Java】 剑指offer(40) 最小的k个数

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7 ...

  4. 《剑指offer》最小的k个数

    题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解析:剑指offer刷到现在,大家可能都有个很大的感触,那就是要非常熟 ...

  5. 最小的k个数 java_【Java】 剑指offer(40) 最小的k个数

    本文参考自<剑指offer>一书,代码采用Java语言. 题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 思 ...

  6. 【力扣刷题】剑指 Offer 40. 最小的k个数(大顶堆)

    题目: 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例: 输入:arr = [3,2,1], k = 2 ...

  7. 剑指 Offer 40. 最小的k个数

    题目 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 输入:arr = [3,2,1], k = 2 输 ...

  8. LeetCode_Heap_剑指 Offer 40. 最小的k个数 【堆,泛型实现,自定义比较器】【C++/java】【简单】

    目录 一,题目描述 英文描述 中文描述 示例与说明 二,解题思路 1,手动实现堆--C++泛型实现 2,手动实现堆--java泛型实现 3,快速使用堆--C++ 优先队列 pop_heap().pus ...

  9. Leetcode 剑指 Offer 40. 最小的k个数 (每日一题 20210825)

    输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4.示例 1:输入:arr = [3,2,1], k = 2 输出: ...

  10. 《剑指Offer》 最小的K个数

    题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 思路: 取input的长度,定义用来返回结果的vector的re ...

最新文章

  1. mysql 移植 azure_初码-Azure系列-记一次MySQL数据库向Azure的迁移
  2. 目标层准则层MATLAB,层次分析法-MATLAB
  3. ABAP 向上取整和向下取整 CEIL FLOOR
  4. 上市公司总市值TOP10出炉,你所在县区看的到未来吗?
  5. SQL Server AlwaysOn中的几个误区
  6. java内存图解_图解JAVA内存模型(JMM:JAVA Memory Model)
  7. python图表可视化工具_比Excel制图更强大,Python可视化工具Altair入门教程
  8. springboot整合通用mapper操作数据库
  9. 安装nokogiri前提
  10. redis笔记1---基础
  11. 进阶15 IO流+字节字符输入输出+IO异常处理+属性集+缓冲流+各种编码+序列化
  12. Root Pane Container(三)
  13. winform textbox文本框根据内容自动调整高度
  14. 如何测试网站服务器大小,如何测试服务器宽带网络大小
  15. python参数类型为uint8,将图像数据类型从uint16转换为uint8
  16. C语言 自定义数据类型(结构体 typedef 共用体 位段 枚举)
  17. 自动文本摘要经典模型TextSum运行录
  18. “Win7内部版本7600此Windows副本不是正版”解决方法
  19. oCPC实践录 | oCPC产品设计与出价原理(1)
  20. 构建Raspberry Pi,脉冲传感器和LCD的心跳计数器

热门文章

  1. Protel (DXP2004sp2) 许可协议认证过程
  2. com.itextpdf.text.exceptions.IllegalPdfSyntaxException: Unbalanced save/restore state operators
  3. Sphinx使用方法
  4. 内网搭建代理DNS使用内网域名代替ip地址
  5. python实现论文查重系统_Python实现的检测网站挂马程序
  6. <C++>多态的实战,详解三个具体案例
  7. 【资源管理器老是重启 win7资源管理器重启的解决办法】
  8. Bitmap createBitmap()裁剪图片
  9. HR 必知的 360 度评估的优缺点
  10. 存储、读取、清除cookies数据