ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

面试题40:最小(大)的K个数

2019-08-10 17:02:26  阅读:200  来源: 互联网

标签:容器 面试题 遍历 tinput 复杂度 个数 40 nlog 二叉树


剑指offer40题,同时这也是面试高发题目

2019.4 蚂蚁金服问道:求1000万个数据中的前K个数。

思路:

1.直接上排序算法,然后我们就取排好顺序的前K个即可。但是单考虑快排,时间复杂度也要O(nlog(n))。这时候我们要对所有数据排序,显然随着数据量的增加,复杂度也是激增的。

2.采用时间复杂度为O(n),这时可以考虑我们之前做过的求第K大的数字。引入partition函数。

3.剑指offer上提供了一种思路:创建一个大小为K的容器,将原数据的前k个放进去,剩下的数据每个都与容器K中的最大值比较,若小于容器中的最大值,就交换。那个这个数据容器用二叉树来试下,最大值通过最大堆获得。

这一题应用堆排序算法复杂度只有O(nlog k),堆是完全二叉树的一种,最大堆就是最上面的数是最大的;该方法基于二叉树或者堆来实现,首先把数组前k个数字构建一个最大堆,然后从第k+1个数字开始遍历数组,如果遍历到的元素小于堆顶的数字,那么久将换两个数字,重新构造堆,继续遍历,最后剩下的堆就是最小的k个数,时间复杂度O(nlog k)。

# -*- coding:utf-8 -*-
class Solution:
    def GetLeastNumbers_Solution(self, tinput, k):
        # write code here
        import heapq
        if tinput==None or len(tinput)<k or len(tinput)<0 or k<=0:
            return []
        
        return heapq.nsmallest(k,tinput)

  

标签:容器,面试题,遍历,tinput,复杂度,个数,40,nlog,二叉树
来源: https://www.cnblogs.com/ivyharding/p/11216099.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有