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

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

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

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

    40520

    最小的 k 个数!

    一、题目描述 输入整数数组 arr ,找出其中最小的 k 个数。例如,输入 4、5、1、6、2、7、3、8 这 8 个数字,则最小的 4 个数字是 1、2、3、4 。...= arr.length <= 10000 0 <= arr[i] <= 10000 二、题目解析 这道题目最简单粗暴的方法当然是将数组 arr 按照从小到大的顺序整体排序之后,获取数组的前 k 个数就行...而整体排序的算法有很多种选择,比如冒泡、选择、快速、堆排序等等。 这种暴力解法肯定不是面试官想要的回答,因为我们没有利用好题目的全部条件。 再读一下这句话:找出其中最小的 k 个数。...* 2)、index 等于 k,说明从 0 到 index 这个区间中的所有元素就是那些最小的 k 个数,将其返回。...* 3)、index 大于 k,说明从 0 到 index 这个左侧区间中的元素超过了 k 个,那么最小的 k个数肯定是都在在这个区间,而中间、右侧区间均可以不去处理,只需要继续对左侧区间进行快速排序即可

    46120

    LeetCode117|最小的k个数

    1,问题简述 输入整数数组 arr ,找出其中最小的 k 个数。 例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。...2,示例 示例 1: 输入:arr = [3,2,1], k = 2 输出:[1,2] 或者 [2,1] 示例 2: 输入:arr = [0,1,2,1], k = 1 输出:[0] 限制:...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);...总结一下 这道题给出了两个题解思路,两种方式都是比较容易理解的,这里就没有给出过多的注释说明,队列的特点在之前的文章中多次说明了,就是先进先出,但是对于应用的开发者来说,熟悉队列的特点也是有必要的,这里就简单的说下

    28210

    《剑指offer》最小的k个数

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

    44510

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

    让我们举几个栗子: 给定整数1593212,删去3个数字,新整数的最小情况是1212 ? 给定整数30200,删去1个数字,新整数的最小情况是200 ?...给定整数10,删去2个数字,新整数的最小情况是0 ? 需要注意的是,给定的整数大小可以超过long类型的范围,所以需要用字符串来表示。 ? ? ? ? ? ? ? ? ———————————— ?...很简单,我们把原整数的所有数字从左到右进行比较,如果发现某一位的数字大于它右面的数字,那么在删除该数字后,必然会使得该数位的值降低,因为右面比它小的数字顶替了它的位置。.../** * 删除整数的k个数字,获得删除后的最小值 * @param num 原整数 * @param k 删除数量 */ public static String removeKDigits.../** * 删除整数的k个数字,获得删除后的最小值 * @param num 原整数 * @param k 删除数量 */ public static String removeKDigits

    93830

    【数据结构与算法面试题】查找最小的k个数

    问题分析:这是一道比较经典的题目,查找最小的k个元素,最简单的方法就是对这n个整数排序,排序完成后,直接输出前k个最小的元素。那么最快的排序方法是快速排序,其算法的时间复杂度为O(nlogn)。...如果最终该划分节点的位置小于k-1,则在右边节点中继续划分;如果最终该划分节点的位置大于k-1,则在左边节点中继续划分。这个过程直到最终的划分节点的位置正好为k-1。...int *a, int length, int k){ if (k > length || NULL == a || length <= 0) return; int new_index...,其中堆的大小为k,若此时堆的大小小于k时,则将数插入堆中;若此时堆中的大小大于等于k,则比较堆中最大的整数与待插入整数的大小,插入较小的整数。...void get_min_k(int *a, int length, int k, set &s){ if (k > length || NULL == a || length <=

    40740
    领券