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

最小K个数

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

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

最小 k 个数

今天继续来学习《剑指Offer》系列一道经典题目,依旧给出了非常详细题解和精美的配图与动画。 一、题目描述 输入整数数组 arr ,找出其中最小 k 个数。...而整体排序算法有很多种选择,比如冒泡、选择、快速、堆排序等等。 这种暴力解法肯定不是面试官想要回答,因为我们没有利用好题目的全部条件。 再读一下这句话:找出其中最小 k 个数。...所在下标 index 与 k 关系 * 1)、index 小于 k,说明从 0 到 index 这个左侧区间中元素不足 k 个,那么最小 k 个数肯定部分是在这个区间,还需要继续在右侧区间中去寻找出一部分元素来填充...,因此对对右侧区间进行快速排序即可 * 2)、index 等于 k,说明从 0 到 index 这个区间中所有元素就是那些最小 k 个数,将其返回。...* 3)、index 大于 k,说明从 0 到 index 这个左侧区间中元素超过了 k 个,那么最小 k个数肯定是都在在这个区间,而中间、右侧区间均可以不去处理,只需要继续对左侧区间进行快速排序即可

36820

最小 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 最小堆过程如下...应该使用大顶堆来维护最小堆,而不能直接创建一个小顶堆并设置一个大小,企图让小顶堆中元素都是最小元素。

36120

最小k个数

,或者有空间限制等,尽量体现在代码中,保证读者可以不漏掉书中细节) 尽量精简话语,避免冗长解释 给出代码可运行,注释齐全,对细节进行解释 题目介绍 输入n个整数,找出其中最小K个数。...例如输入4,5,1,6,2,7,3,8这8个数字,则最小4个数字是1,2,3,4,。...方法一:基于快速排序变种 O(n) 思路 该方法需要改变原数组。 还记得上一题:数组中超过一半数字么?这一题思路和上题类似,仅仅是换成了k最小数字。 这种算法是受快速排序算法启发。...这样遍历一边数组后,得到一个k个数最大堆,这个最大堆里存最小k个数。...()); 有的小伙伴会问,为啥最大堆是最小k个数

93620

算法(六)二叉堆获取最小k个数

关键词:heap 如果你有一个文件,里面包含20万行整数,如何获取前k最小数?首先可以想到两个思路: 将所有的数按从小到大排序,取前k个。...先读入前k个数到一个数组中(大小为k)并按从小到大排序,然后每读入一个新数就将其放入数组中合适排序位置。当所有的数都按这个规则被处理后,最终留在数组中k个数就是我们想要。...(具体代码见下文) 假设我们文件 20w_int.txt 包含20万行整数,三种方法取前k最小数用时如下: (其中sort代表第一种思路,k-array代表第二种思路,heap代表堆这种思路) ?...直接用GNU sort就行,假设取前10个最小数: sort -n 20w_int.txt | head -10 第二种思路——k-array 先读入前k个数到一个数组中(大小为k)并按从小到大排序,...当所有的数都按这个规则被处理后,最终留在数组中k个数就是我们想要

49130

《剑指offer》最小k个数

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

42910

LeetCode117|最小k个数

1,问题简述 输入整数数组 arr ,找出其中最小 k 个数。 例如,输入4、5、1、6、2、7、3、8这8个数字,则最小4个数字是1、2、3、4。...0 <= k <= arr.length <= 10000 0 <= arr[i] <= 10000 3,题解思路 使用排序,队列方式进行解决 4,题解程序 import java.util.Arrays...] result = new int[k]; if (k >= 0) { System.arraycopy(arr, 0, result, 0, k);...} return result; } } 5,题解程序图片版 6,总结一下 这道题给出了两个题解思路,两种方式都是比较容易理解,这里就没有给出过多注释说明,队列特点在之前文章中多次说明了...,就是先进先出,但是对于应用开发者来说,熟悉队列特点也是有必要,这里就简单说下

26310

漫画学算法:删去k个数字后最小

让我们举几个栗子: 给定整数1593212,删去3个数字,新整数最小情况是1212 ? 给定整数30200,删去1个数字,新整数最小情况是200 ?...给定整数10,删去2个数字,新整数最小情况是0 ? 需要注意是,给定整数大小可以超过long类型范围,所以需要用字符串来表示。 ? ? ? ? ? ? ? ? ———————————— ?...我们来举一个栗子: 给定整数 541270936,要求删去一个数,让剩下整数尽可能小。 此时,无论删除哪一个数字,最后结果都是从9位整数变成8位整数。.../** * 删除整数k个数字,获得删除后最小值 * @param num 原整数 * @param k 删除数量 */ public static String removeKDigits.../** * 删除整数k个数字,获得删除后最小值 * @param num 原整数 * @param k 删除数量 */ public static String removeKDigits

91930

LeetCode70|最小K个数

1,问题简述 设计一个算法,找出数组中最小k个数。以任意顺序返回这k个数均可。...2,示例 示例: 输入:arr = [1,3,5,7,2,4,6,8], k = 4 输出:[1,2,3,4] 提示: 0 <= len(arr) <= 100000 0 <= k <= min(100000...; } } 5,题解程序图片版 6,总结 排序在整个工作中还是比较常用一种场景,排序目的是为了更加高效检索自己需要数据,对于数据库优化,为什么要加索引,难道不是为了更加高效检索自己需要数据嘛...最近一段时间输出文章都是自己之前做过内容,自己打算将做过题都整理成一篇篇文章进行梳理一下,喜欢看java文章可以查看历史记录,本人写过Mybatis框架系列文章,包括简单增删改查,高级用法,...都是工作中常用,JDK源码也写了十几篇,MySQL文系列文章等都可以在历史文章进行查找

38110
领券