首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

寻找最大K个数

给你n个数,让你找出其中最大K个数。 解法1: 很多人上来就对其进行排序,选用不同的排序方法有不同的时间复杂度,这里我们假设使用了最快的快排,时间复杂度为O(n*logn)。...通过排序我摘出前K大的数。 但也许快排不是最优的,我们只找最大K个数,何必要对所有的数进行排序,我们只需要进行局部排序即可,时间复杂度大概是O(N*K)。...在这里,我们只要在递归过程中选包含最大K个数的部分进行完整的快排,而对于其他的部分只进行快排的一部分。 关于使用快排求第K大数的方法参见其他博文。...在这个基础上,只需要做小小的改进就可以完成寻找最大K个数的功能了,时间复杂度O(N)。...结果遍历所有元素后,我们都得到保存最大K个数的堆,也就到达了我们的目的。

74920

求一个数组的最大k个数(java)

问题描述:求一个数组的最大k个数,如,{1,5,8,9,11,2,3}的最大个数应该是,8,9,11 问题分析:     1.解法一:最直观的做法是将数组从大到小排序,然后选出其中最大K个数,但是这样的解法...但是这都是会对前K个数进行排序,所以效率不高,当K很大的时候,以上两种方法效率都不是很高。    ...2.解法二:不对前K个数进行排序,回忆快排的算法中,那个partition函数,就是随机选择数组中的一个数,把比这个数大的数,放在数组的前面,把比这个数小的数放在数组的 后面,这时想如果找出的随机数,最终位置就是...K,那么最大K个数就找出来了,沿着这个思路思考问题,但是这个函数,最后的索引位置并不一定是K,可能比K大也可能比K小,我们把找出的数组分成两部分sa,sb,sa是大的部分,sb是小的部分,如果sa的长度等于...K中元素的一部分,再从sb中找到,k-m个最大的元素,组合起来就是最终的结果,那么这时把问题简化成从sb中找k-m个最大的元素,所以总体来说这是一个递归的过程,虽然复杂大也是O(n*logn)但是,每一次数据量都会减少所以会更加的快

80120
您找到你想要的搜索结果了吗?
是的
没有找到

go实现利用最大堆寻找最小k个数

作者 | 陌无崖 转载请联系授权 导语 昨天分享了寻找最小k个数算法是,那么有没有更为迅速的方法呢?今天就来分享关于如何使用最大堆进行解决。...思路设计 知道了如上定义,我们就可以将容量为K最大堆存储我们的最小k个数,因此我们仍然可以按照之前的方法假设堆中存储的仍然是最小的k个数(不懂的可以看我的上一篇文章),再通过比较替换或不替换堆来最终找到我们的最小的...k个数。...此解法与解法二类似但由于使用堆时进行查找或更新的时间复杂度降低到了O(logk),那么通过遍历剩余的n-k个数,那么最坏情况下的时间复杂度为O(k + (n-k)logk) = O(nlogk)。...func topK(data []int, k int) { // 建立前K个数最大堆 BuildMaxHeap(data[0:k]) for i := k; i < len(data)

1.1K20

最大数字 题解 (删除k个数字----贪心)

给你一个整数 n,使得从 n 中删除 k 个数字之后的数字最大。...输入 输入一个整数 n (0 <= n <= 10^100),和需要删除数字 k <= 100的个数 输出 输出删除k个数字之后的最大整数 样例输入 1432219 3 样例输出 4329...根据题意, 就是删除k个数字 保持原序列顺序不变的情况 下,使得 剩下的数字组成的最大。...我们一般比较一个数的大小,是怎么比的 ,比如 8999 9000 ,是不是先看最高位, 第一个数最高位为8 第二个数最高位为9,那么后面根本就不用关心。所以一个数大不大 由高位决定。...例如  1432219   要删除 3个  先通过 人工删除 肯定 删除 两个1 再删 一个2 就得到 最大数字, 4329。

33010

最大公约数算法_求最大公约数最快方法

一 写在开头 1.1 本节内容 本节主要内容为几种常见的两个数最大公约数(Greatest Common Divisor)的求法。...二 辗转相除法 2.1 辗转相除法原理 辗转相除法也叫欧几里得算法,是一种非常古老的求解两个数最大公约数的算法。...比如,10和25的最大公约数5等于25除以10的余数5和10的最大公约数;再比如51和21的最大公约数3等于51除以21的余数9和21的最大公约数,而9和21的最大公约数为3。...上面的算法原理中不是要求a大于b吗?如果调用时a值大于b值,比如a为51,b为21,那么情况跟上述算法原理是相符的。...依次递归下去,直到两个数相等。这相等两个数的值就是所求最大公约数。

58911

海量数据处理 - 找出最大的n个数(top K问题)

以上就是面试时简单提到的内容,下面整理一下这方面的问题: top K问题 在大规模数据处理中,经常会遇到的一类问题:在海量数据中找出出现频率最好的前k个数,或者从海量数据中找出最大的前k...个数,这类问题通常被称为top K问题。...词频,之后用小顶堆求出每个数据集中出现频率最高的前K个数,最后在所有top K中求出最终的top K。...eg:有1亿个浮点数,如果找出期中最大的10000个? 最容易想到的方法是将数据全部排序,然后在排序后的集合中进行查找,最快的排序算法的时间复杂度一般为O(nlogn),如快速排序。...第三种方法是分治法,将1亿个数据分成100份,每份100万个数据,找到每份数据中最大的10000个,最后在剩下的100*10000个数据里面找出最大的10000个。

4.9K40

移除K个数

Remove K Digits 已知一个使用字符串表示的非负整数num,将num中的k个数字移除, 求移除k个数字后,可以获得的最小的可能的新数字。...(num不会以0开头,num长度小于10002) 输入 : num = “1432219” , k = 3 在去掉3个数字后得到的很多很多可能里,如1432、4322、2219、1219、 1229....算法设计 使用栈存储最终结果或删除工作,从高位向低位遍历num, 如果遍历的数字大于栈顶元素,则将该数字push入栈 如果小于栈顶元素则进行pop弹栈,直到栈为空或不能再删除数字 (k==0)或栈顶小于当前元素为止...边界条件 1.当所有数字都扫描完成后,k仍然>0,应该做怎样的处理? 例如: num = 12345, k = 3 时。 2.当数字中有0出现时,应该有怎样的特殊处理?...= 0 && S[S.size() -1]>number && k>0){//当栈不空,栈顶元素大于number S.pop_back(); k --;

82630

最小的K个数

题目: 思路: 思路一:直接利用快速排序的方法对数组进行排序,时间复杂度为O(NlogN),简单便捷,排完序之后便是有序的数组,直接去前K个数出来 思路二:根据一次快排(Partition)的想法,我们知道一次随机快速排序可以确定一个有序的位置...,这个位置的左边都小于这个数,右边都大于这个数,我们如果能找到随机快速排序确定的位置等于k-1的那个位置,那么0-k-1个数就是我们要找的数。...如果Partition确定的位置大于K-1,说明k-1这个位置在它的左边,我们继续在左边进行查找。 缺点: 这种方法的时间复杂度虽然是O(n),但是找出来的最小的K个数却不是排序过的。...思路三:利用大顶堆或小顶堆的思路,就是循环一遍数组,先直接将数组的前K个数直接塞入数组TEMP,构建堆。...然后从第K个数开始循环,先取出TEMP的第k-1个数值(即最大或者最小),进行比较,如果符合条件(即大于或小于),将堆的K-1踢出,将新值放入,重新构建堆。重复以上步骤直至循环结束。

29010

最小的 K 个数

题目描述 描述 给定一个长度为 n 的可能有重复值的数组,找出其中不去重的最小的 k 个数。...例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4(任意顺序皆可)。...数据范围:0≤k,n≤10000,数组中每个数的大小0 ≤val≤1000 要求:空间复杂度 O(n) ,时间复杂度 O(nlogn) 输入: [4,5,1,6,2,7,3,8],4 返回值: [1,2,3,4...] 说明: 返回最小的4个数即可,返回[1,3,2,4]也可以 解题思路 大小为 K 的最小堆 时间复杂度:O(NlogK) 空间复杂度:O(K) 特别适合处理海量数据 维护一个大小为 K 的最小堆过程如下...在添加一个元素之后,如果大顶堆的大小大于 K,那么将大顶堆的堆顶元素去除,也就是将当前堆中值最大的元素去除,从而使得留在堆中的元素都比被去除的元素来得小。

35720

最小的 k 个数

一、题目描述 输入整数数组 arr ,找出其中最小的 k 个数。例如,输入 4、5、1、6、2、7、3、8 这 8 个数字,则最小的 4 个数字是 1、2、3、4 。...而整体排序的算法有很多种选择,比如冒泡、选择、快速、堆排序等等。 这种暴力解法肯定不是面试官想要的回答,因为我们没有利用好题目的全部条件。 再读一下这句话:找出其中最小的 k 个数。...这句话隐藏着以下几个意思: 1、找出的这 k 个数并不需要按照顺序排列。 2、如果一开始就知道某个数不在这 k 个数中,完全可以将它丢到一旁。...* 2)、index 等于 k,说明从 0 到 index 这个区间中的所有元素就是那些最小的 k 个数,将其返回。...,找到那 k 个数

36420
领券