数组里前K个最小的数

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

给定一个数组,返回前K个最小的数。

方法一 大根堆 时间复杂度(nlogK)

因为只要求出前K个最小的数,于是我们可以先建一个大小为K的大根堆,然后遍历数组内余下的元素,如果当前元素A[i] 比堆顶元素小,则将堆顶元素换为A[i] 向下调整堆,否则继续遍历。

void adjustDown(vector<int> &A,int k, int len) {
    int root = A[k];

    for (int i = 2*k+1; i < len; i = i*2 + 1) {
        if( i < len && A[i] < A[i+1]) ++i;
        if (root >= A[i]) 
最小k个 最近在hadoop上写了一个分布式的KNN,其实本地的KNN也是需要用到的一个东西——从N个距离中选出K个最小的,从而投票得出预测的类别。这个问题看似很简单,但要做好,还是有难度的。 阅读详情

相关推荐

寻找数组K个最小(Kth smallest element)---(堆排序的应用)

日常生活中我们总是遇到求解一个数组最小值或者最大值等问题,这些问题基本上都可以在

Leon_THU的专栏 2633

经典的 Top K 问题

面试题1 (经典的 Top K 问题): 输入整数组 arr ,找出其中最小的 k 个。例如,输入4、5、1、6、2、7、3、8这8个字,则最小的4个字是1、2、3、4。 示例 1: 输入:arr = [3,2,1], k = 2 输出:[1,2] 或者 [2,1] 示例 2: 输入:arr = [0,1,2,1], k = 1 输出:[0] 限制: 0 <= k <= arr...

carpe_diem0的博客 1462

两个排序数组合并第k或k个最小值问题

1.X[1..n] 和 Y[1..n]为两个数组,每个都包含n个已排好序的。给出一个求数组X和Y中所有2n个元素的中位的O(lgn)时间的算法 参考 :http://blog.csdn.net/zhanglei8893/article/details/6314002 2.假设a[m], b[n]是两个排好序的数组,并且没有重复元素,要找第k小的元素 参考: http://bbs.csdn

KUAILE123的专栏 2873

leetcode—26.求k大值与k小值

文章目录引言1.求最小的k个剑指 Offer 40. 最小的k个2.求最大的k个 引言   这是一类面试中特别容易被问到的题目,这采用两种方法二叉堆与快速排序。 1.求最小的k个 剑指 Offer 40. 最小的k个 输入整数组 arr ,找出其中最小的 k 个。例如,输入4、5、1、6、2、7、3、8这8个字,则最小的4个字是1、2、3、4。 思路一:二叉堆 思路:建立一个大顶堆,维持堆的大小为k,如果新入队后,堆的大小大于k,则与新入队元素与堆顶比较,将较大的移除,这样就可以

柳杰的博客 983

在一个数组中找到k个小(大)的

11.给定一个一维数组,找出其中最小K个,要求算法的时间复杂度为O(nlogK) solution: 借鉴堆排序的算法,通过使用最小堆选出K个最小。 首先创建size=K的最小堆;堆顶为堆中最大的元素。 然后遍历数组元素,往最小堆中插入元素,如果堆的个已经达到K。那么新插入的元素需要和堆顶元素比较。如果这个元素小于 堆顶元素,将堆顶元素移除,插入新的元素。 最后当遍历结束

Nigel_Lee专栏 938

找出数组K个最小-Python实现

寻找数组中给定的第K大的,或者K个最大的,与之同理,稍加改动即可 思路1:二叉堆。 假设数组长度为N,首先取K个,构建二叉堆(大顶堆),然后将剩余N-K个元素,依次与堆顶元素进行比较,若小于堆顶元素,则替换, 并重新为大顶堆。 代码如下 # 最大堆下沉调整 def downAdjust(ary_list, parent_index, length): tmp = ary_l...

AI智能,无处不在 8252

算法---数组总结篇2——找丢失的,找最大最小k大,第k小的

一、如何找出数组中丢失的 题目描述:给定一个由n-1个整数组成的未排序的数组序列,其原始都是1到n中的不同的整,请写出一个寻找数组序列中缺失整的线性时间算法 方法1:累加求和 时间复杂度是O(N) 方法2:异或法,要先对实际无缺失的arr中的值异或,然后再对估计的值异或;缺失的值就是最终异或得到的值 时间复杂度O(N) 方法3:遍历一遍,用字典记录字出现的次,遇到出现2...

dili8870的博客 587

数组k大的系列

1. 概述 给定一个数组array,大小为n,找到其中第k大的或者k大的。这是一个电面高频题,有快排,堆排等多种思路来解题,本文章将从时间复杂度和空间复杂度,来介绍这些算法以及它们所适用的场景 2. 堆排 直观上理解找到第k大或者k大的,用的是最大堆,但实际上最小堆也是可以的,至于具体使用哪一种,则取决于问题的场景。一般来说,面试答的是最小堆(省空间) 2.1 最大堆 要找第k大的元素,...

u014514939的博客 2615

java通过最小堆算法实现无序数组查找第K大的

public class FindNumK { public static void main(String[] args) { int[] arr = {7,5,15,3,17,2,20,24,1,9,12,8}; int k = 5; System.out.println("------------计算--------------"); for(int i : ...

渴望变强 2159

找出无序数组最小k个

/* DJ.W 2013.1.3 算法描述:找出一无序整型数组arr[n]中最小k个 算法思路:为k个元素建一个大顶堆min[k],初始化为数组arr的k个元素 调整这k个元素使其满足大顶堆性质 此时min[0]为大顶堆中最大的元素,依次用arr[j](k<=j<n)与min[0]相比较 如果arr[j]小于min[0] 则将min[0]换为arr[j]

WUDAIJUN的博客 1877

K小的和第K小的

K小的和第K小的 1. K小的    (堆排序实现) #include #include #include using namespace std; // 调整堆函 void HeapAdjust(int *a, int i, int size) // a:数组;i:节点index;size:树的规模 { int lchild = 2 * i + 1; // 节点的

bigfacesafdasgfewgf 1009

C++ 经典算法题目k大的

求一个给定数组k个有多种方法一 方法一:排序取k个,时间复杂度nlogn 方法二:维护一个最大堆,时间复杂度nlogn 方法三:维护一个容量为k的最小堆,代码如下,时间复杂度O(nlogk) #include <iostream> #include <vector> #include <queue> std::vector<int&g...

wwxy1995的博客 2701

数组:如何找出数组中第k个最小

问题描述: 给定一个无序的数组,从一个数组中找出第k个最小,例如,数组{ 1,5,2,6,8,0,6 }, 其中第4小的为5 思路分析: 方法一:排序法 最数组进行排序,排序后的第k-1个位置上的字即为数组的第k个最小,时间复杂度为O(nlogn) 方法二:剪枝法 采用快速排序的思想来实现。选一个 tmp = a[n-1] 作为枢纽, 把比他小的都放在他的左边,比他大的...

weixin_38108266的博客 8242

一个n位的,去掉其中的k个,使剩下的最小

一个n位的,去掉其中的k位,问怎样去使得留下来的(n-k)位按原来的后顺序组成的最小 思路一: 分析:求一共n位,求其中的m位组成的最小。那么这个m位的,最高位应该在原的最高位到第m位区间找,要不然就不能当第m位了。 比如一个:8 4 7 9 6 3 5 2 n = 8, k = 3; 1.第一个应在 8 —— 3 间(含8和3)选最小的,应为3 2.第二个应在5——2 间(含...

博客——XiaoTang 3952

找出数组最小的k个

LeetCode https://leetcode-cn.com/problems/zui-xiao-de-kge-shu-lcof/ 面试题40. 最小的k个 解法一:O(nlogn) 快速排序,时间复杂度为nlogn,然后k个元素就是最小的k个 class Solution { public int[] getLeastNumbers(int[] arr, int k) {...

Mason97的博客 3424

算法之查找第k小的和查找最小的k个元素

利用快速排序的思想查找第k小的,其中用到了随机,但是主要的核心思想还是快速排序,具体的细节可以查看《算法导论》第九章,下面只是照书上实现的代码:             /* 查找据组中,第k小的 */ #include #include const int MAX = 1000; void exchange(int &a,int &b) { int temp=a; a=b;

qingtianweichong的专栏 4326

n个最小的k个

链接 来源:牛客网 [编程题]n个最小的k个 找出n个最小的k个 输入描述: 每个测试输入包含空格分割的n+1个整,最后一个整为k值,n 不超过100。 输出描述: 输出n个整最小的k个。升序输出 示例 输入 3 9 6 8 -10 7 -11 19 30 12 23 5 输出 -11 -10 3 6 7 解题思路: 只要将得到的数组排序好然后输出k个最小的元素就可以了,...

weixin_44376490的博客 499

如何找出数组中第k个最小

方法一:排序法 最容易想到的方法就是对数组进行排序, 排序后的数组中第k-1个位置上的字即为 组的第k个最小(原因是数组下标从0 开始计),这种方法最好的时间复杂度为 O(nlogn)。 方法二:“剪枝”法 找一个标签,比标签小的都放左边,比标签大的都放右边,如果标签最终的位置为k-1,则找到了,如果位置小于k-1,右半部分继续用标签来找,否则左半部分用标签来找,递归下去。 publi...

Mason97的博客 2612

Leetcode215数组中第k大的-最小

C++最小堆(优先级队列)求解数组中第k大的

阿正的梦工坊 852
上一篇: 机器学习笔记之决策树
下一篇: 给定数组,求改数组中逆序对有多少个?
alwaysRememberrr
博客等级 码龄13年 32粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值