首页
学习
活动
专区
圈层
工具
发布

最小的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踢出,将新值放入,重新构建堆。重复以上步骤直至循环结束。

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

    最小的k个数

    例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。...在随机快速排序算法中,我们先数组中随机选择一个数字,然后调整数组中数字的顺序,使得比选中的数字小的数字都排在它的左边,比选中的数字大的数字都排在它的右边。...构造一个最大堆,最大堆的性质就是堆顶是所有堆中数字的最大值,那么放入k个数字,随后将数字中k个数字之后的数字依次和堆中的最大数字比较(也就是和堆顶数字比较),如果小于他,就把堆顶数字弹出,放入小的数字,...这样遍历一边数组后,得到一个k个数字的最大堆,这个最大堆里存的是最小的k个数。...()); 有的小伙伴会问,为啥最大堆是最小的k个数?

    46130

    最小的 K 个数

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

    47220

    最小的 k 个数!

    今天继续来学习《剑指Offer》系列的一道经典题目,依旧给出了非常详细的题解和精美的配图与动画。 一、题目描述 输入整数数组 arr ,找出其中最小的 k 个数。...例如,输入 4、5、1、6、2、7、3、8 这 8 个数字,则最小的 4 个数字是 1、2、3、4 。...这句话隐藏着以下几个意思: 1、找出的这 k 个数并不需要按照顺序排列。 2、如果一开始就知道某个数不在这 k 个数中,完全可以将它丢到一旁。...也就意味着,在排序过程中,我们可以去不断的缩小排序的区间,这里我们借助快速排序的代码,稍微的改动几行就完成了这道题目。...具体操作如下: 1、以当前区间的第一个元素为基准元素 pivot,根据快速排序的操作,将当前区间划分为了三个区间。

    54620

    最小的k个数

    例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。...在随机快速排序算法中,我们先数组中随机选择一个数字,然后调整数组中数字的顺序,使得比选中的数字小的数字都排在它的左边,比选中的数字大的数字都排在它的右边。...构造一个最大堆,最大堆的性质就是堆顶是所有堆中数字的最大值,那么放入k个数字,随后将数字中k个数字之后的数字依次和堆中的最大数字比较(也就是和堆顶数字比较),如果小于他,就把堆顶数字弹出,放入小的数字,...这样遍历一边数组后,得到一个k个数字的最大堆,这个最大堆里存的是最小的k个数。...()); 有的小伙伴会问,为啥最大堆是最小的k个数?

    1K20

    【分治】最小的k个数

    最小的k个数 剑指 Offer 40. 最小的k个数 输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。...数组中的第K个最大元素 一样,同样可以使用排序或者堆来解决,但是它们的时间复杂度分别是 O(n * logn) 和 O(n * logk),还达不到这道题的极致,我们可以采用前面学的快速排序中分三块区间的思想来优化这道题...数组中的第K个最大元素 不一样的是,这次要求的是最小的 k 个数,也就是说和上次相反,并且返回的是一个数组,但是思路还是一样的! ​...因为这道题要返回的是数组类型,所以我们可以考虑 在原数组上,将前 k 个最小的数放到最左边,然后直接返回即可,所以此时分区完之后 k 也同样是有三种情况,如下所示:(这道题没要求返回数组要有序) 如果...如果 k ≤ a + b 的话: 这种情况就是前 k 个最小的数已经覆盖了第一个全都小于 key 的区间,但是不超过全都等于 key 的区间,又因为 [left + 1, right - 1] 这个区间本质上所有元素都是相等的

    10800

    一个数组中找最大值和最小值

    这个不是lintcode里的题目,但是感觉很经典,放在这里。 给定一个数组,在这个数组中找到最大值和最小值。...最近在看一点算法书,看到分治法经典的金块问题,实质就是在一个数组中找到最大值和最小值的问题。 我们用分治法来做,先把数据都分成两两一组,如果是奇数个数据就剩余一个一组。...如果是偶数个数据,就是两两一组,第一组比较大小,分别设置为max和min,第二组来了自己本身内部比较大小,用大的和max进行比较,决定是否更新max,小的同样处理,以此类推。...如果是奇数个数据,就把min和max都设为单个的那个数据,其他的类似上面处理。 书上说可以证明,这个是在数组中(乱序)找最大值和最小值的算法之中,比较次数最少的算法。...瞄了一眼书上的写法,还是很简单的,一遍过。 //这是一中分治法,这是在寻找最大值和最小值比较次数最小的方法。

    3.2K10

    Java中获取一个数组的最大值和最小值

    1,首先定义一个数组; //定义数组并初始化 int[] arr=new int[]{12,20,7,-3,0}; 2,将数组的第一个元素设置为最大值或者最小值; int max=arr[0...];//将数组的第一个元素赋给max int min=arr[0];//将数组的第一个元素赋给min 3,然后对数组进行遍历循环,若循环到的元素比最大值还要大,则将这个元素赋值给最大值;同理,若循环到的元素比最小值还要小...,则将这个元素赋值给最小值; for(int i=1;i的第二个元素开始赋值,依次比较 if(arr[i]>max){//如果arr[i]大于最大值...main(String[] args) { //定义数组并初始化 int[] arr=new int[]{12,20,7,-3,0}; int max=arr[0];//将数组的第一个元素赋给...max int min=arr[0];//将数组的第一个元素赋给min for(int i=1;i的第二个元素开始赋值,依次比较

    8.3K20

    《剑指offer》最小的k个数

    本系列是《剑指offer》或leetcode的JavaScript版本。 每期1-2个算法,也有可能是一个类别。 文章包括题目、思路以及代码。...如果您对本期有不同或者更好的见解,请后台留言,喜欢请点个好看,谢谢阅读。 题目 输入n个整数,找出其中最小的K个数。...例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。...思路 1.把前k个数构建一个大顶堆 2.从第k个数开始,和大顶堆的最大值进行比较,若比最大值小,交换两个数的位置,重新构建大顶堆 3.一次遍历之后大顶堆里的数就是整个数据里最小的k个数。...k个值中的最大值小 if (input[i] < input[0]) { [input[i], input[0]] = [input[0], input[i]];

    49210

    数组最大最小值与一个数组push到另外一个数组

    apply的可以将数组解析为参数列表来解决 var max=Math.max.apply(null,array),这样轻易的可以得到一个数组中最大的一项 这块在调用的时候第一个参数给了一个null,这个是因为没有对象去调用这个方法...,我只需要用这个方法帮我运算,得到返回的结果就行,.所以直接传递了一个null过去 var max=Math.max.apply(null,array) 其实等价于Math.max(array),只是利用了...",").split(","); //转化为一维数组 alert(Math.max.apply(null,ta)); //最大值 alert(Math.min.apply(null,ta));//最小值...var arr1=[1,3,4]; var arr2=[3,4,5]; 如果我们要把 arr2展开,然后一个一个追加到arr1中去,最后让arr1=[1,3,4,3,4,5] arr1.push(...因为这样做会得到[1,3,4,[3,4,5]] 我们只能用一个循环去一个一个的push(当然也可以用arr1.concat(arr2),但是concat方法并不改变arr1本身)  var arrLen

    85120
    领券