O(n)复杂度求区间第K大

介绍一种O(n)复杂度求解数组中第K大元素的方法,通过一次遍历将数组分为大于、等于、小于目标值三个部分,递归直至找到确切答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

O(n)复杂度求区间第K大

描述

给你一个数组,O(N)复杂度找出其中第K大的数.

输入
第一行包括两个数,N,K,分别代表数组大小,以及你应该找出第K大的数.
接下来N行,每行包括一个数.

输出
输出第K大的数.

下附AC代码

#include <stdio.h>
int a[1000000],b[1000000],c[1000000];
void seek(int a[],int b[],int c[],int k,int n){
    int i=0,j=n;
    int temp=a[i],count=0,d=0,e=0;
    for(int i=0;i<n;i++){
        if(a[i]==temp)count++;
        else if(a[i]>temp)b[d++]=a[i];
        else c[e++]=a[i];
    }
    if(k>d&&k<=d+count){
        printf("%d",temp);
        return;
    }
    else if(d>=k)seek(b,a,c,k,d);
    else seek(c,a,b,k-count-d,e);
}
int main() {
    int n,k;
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    seek(a,b,c,k,n);
    return 0;
}

问题本身不难,主要考虑随机设一个数然后把比它小的放左边,比它大的放右边,每次都能排除一定比例的元素,根据等比数列求和可知该算法为O(n)复杂度,应该可以说是平均下来最快的代码了。
PS:题目可能卡读入,用cin输入如果没有关同步的话会输入很慢,所以简单起见用scanf就好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值