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

面试必问:找出一组数中最小的K个数(海量数据Top K问题)

题目 输入 n 个整数,找出中最小的 k 个数。例如输入4、5、1、6、2、7、3、8 这8个数字,则最小的4个数字是1、2、3、4。...解法一:脱胎于排的O(n)的算法 如果基于数组的第 k 个数字来调整,使得比第 k 个数字小的所有数字都位于数组的左边,比第 k 个数字大的所有数字都位于数组的右边。...找出这已有的 k 个数中的最大值,然后拿这次待插入的整数和最大值进行比较。...,找出最大的前100个。...若是遇到此类求海量数据中最大的 k 个数的问题,可以参考上面的求最小的 k 个数,改用最小堆,实现如下的 Java 代码: public class TopK { public Integer

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

获取数组中最小的k个数字_29

www.jianshu.com/writer#/notebooks/40413732/notes/55370532 我们这里和普通堆排序和堆数据修改有一点区别,那就是这里我们需要先实现一个小根堆,然后每一次拿第一个数据然后把这个数据删掉...,但是我们这里存在一个问题,数组不太好删数据,删除的话要进行一个所有数据的前移,因此, 我这里取了个巧,我把第一个数字和最后一个数字交换,然后我当这个数组的长度减了1,当最后一个数字不存在,然后会进行一个从顶到下的重建...,同理第二大的数字出来后与倒数第二个交换,当倒数第二个数就不存在了,以此类推。。。...public int rightChild(int parentIndex) { return 2 * parentIndex + 2; } 同理这里也把拿最大的k个数实现了

38910

滴滴2020年面试题:如何找出最小的N个数

别着急,我们用逻辑树分析方法,把这个复杂问题拆解为一个一个可以解决的简单问题: 1)筛选条件:入学时间是2017,专业是计算机 2)最小的3位同学名单(姓名、年龄) 1.先找出符合要求的同学 筛选条件...by 学号) as bon a.学号=b.学号group by 班级 【本题考点】 1.使用逻辑树分析方法将复杂问题变成简单问题的能力 2.当遇到“每个”问题的时候,要想到用分组汇总 3.查询最小n个数据的问题...有筛选条件的统计数量问题的万能模板 select sum(case when  then 1       else 0end) as 数量from 信息表; 【举一反三】 1.查询最小/最大的N个数据的问题...某网站有购买记录表,找出消费最大的2名顾客,输出顾客ID和消费金额 select 顾客ID,消费金额from 购买记录表order by 消费金额 desclimit 2; 2.

95300

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

先拿10000个数建堆,然后一次添加剩余元素,如果大于堆顶的数(10000中最小的),将这个数替换堆顶,并调整结构使之仍然是一个最小堆,这样,遍历完后,堆中的10000个数就是所需的最大的10000个。...eg:有1亿个浮点数,如果找出中最大的10000个? 最容易想到的方法是将数据全部排序,然后在排序后的集合中进行查找,最快的排序算法的时间复杂度一般为O(nlogn),如快速排序。...第三种方法是分治法,将1亿个数据分成100份,每份100万个数据,找到每份数据中最大的10000个,最后在剩下的100*10000个数据里面找出最大的10000个。...每个线程的处理速度可能不同,的线程需要等待慢的线程,最终的处理速度取决于慢的线程。...(5)10亿个整数找出重复次数最多的100个整数。 (6)搜索的输入信息是一个字符串,统计300万条输入信息中最热门的前10条,每次输入的一个字符串为不超过255B,内存使用只有1GB。

4.9K40

用C语言实现在10个整数中找出中最值的差

1.题目叙述: 输⼊10个整数,写代码找出中最⼤值和最⼩值,计算最⼤值和最⼩值的差,并打印出差值结果; 2.思路 我们可以使⽤⼀个循环来输⼊这10个整数并记录在⼀个数组中,然后使⽤另⼀个循环查找两个最...然后我们通过循环,将剩余的 9 个数与当前的最⼤值和最⼩值进⾏⽐较,更新 max 和 min 的值,直到所有的数都输⼊完毕。 3. 最后,我们计算出最⼤值和最⼩值的差值,并打印输出。...• 特别地,我们可以使⽤⼀个变量记录输⼊的数,在每次需要更新最值前,输⼊⼀个数与之进⾏判 断,从⽽避免了定义数组。...include #include int main() { int arr; //输入数据 scanf("%d", &arr); //将两个最值初始化为第一个数...int Max = arr; int Min = arr; //遍历剩余9个数 int i = 0; for (i = 1; i < 10; i++) { //输入数据 scanf

5010

Go寻找数组中最小的k个数——全部排序和部分排序

作者 | 陌无崖 转载请联系授权 导语 今天分享的是数组中寻找k个最小数的解题思路,分别是全部排序和部分排序,一起来看看吧~ 题目要求 有n个整数,请找出中最小的k个数,要求时间复杂度尽可能的低...听起来有点晦涩难懂,简单来说就是对于一个数组,我们随便找一个数字,将这个数字和其它数字进行比较,比它大的放右边,比它小的放左边。...然后就分成了两个数组,通过同样的方法将其余的两个数组进行找数字,排序,每个数组又得到两个数组,一直循环通过以上的方式,最终一定会出现只包含两个数字的数组,因为已经排好序,并且小的一直放在右边,大的一直在左边...,因此我们只需要对部分元素进行排序,可以用如下的思路,我们可以选择前k个数默认为最小的k个数,存到数组temp中,然后求出temp数组中的最大值,用这个值去和其它的数比较,如果发现有比这个数小的,就进行交换...,按照 上面的方式比较,求出第二个数字 (4)和第二个数进行交换 .....

1.2K20

找出和为目标值的两个数的下标#算法#

翻译:给定一个整数的数组,返回和为一个特定目标数的两个数的下标。可以假设(认为)每个输入有且只有一个结果,且相同的数不能用到两次。...} } } return result; } }; ##思路二 容易想到的方法往往效率不高,再往深一层想,能想到的就是要找到两个数相加为某个数...,这个选择跟大小有关系,因为如果两个数相加大于目标数,那其他比这两个数都大的数对是没必要考虑的,所以如果是排好序的数组,就相对容易找了,一个方法是从有序数组的两端往中间靠拢(见以下代码),这样寻找的时间复杂度为...再次回到思路一,在第一层遍历时,先确定了一个数a,第二层遍历是要找到剩下的数中有没有符合条件的数(可确定的一个数),即target - a,有没有什么办法可以快速找到符合条件的数的下标,从而避开这第二层遍历呢...以下是思路二提交了两次的结果,其速度也可媲美思路三: ##思路三改进 思路三需要两次遍历,其实不一定需要把所有数据都加入hash表,因为可能在前几个数就能找到结果了。

30810
领券