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就好了。