我想设计一个函数来查找具有时间复杂度的 N 个无序元素集合中的 k 个最大元素:Θ(N+klogN)
在线判断。
这是一个示例:
输入
LN 1 : N K
LN 2 : N numbers
输出
LN 1 : K biggest number
LN 2 : Final heap
样本输入
10 4
17 19 26 37 30 11 5 29 32 1
样本输出
29
26 19 11 17 1 5
这是我的代码:
#include <iostream>
using namespace std;
int main(){
int i,j,rc,temp,temp1,length,K;
cin>>length>>K;
int *heap = new int[length];
for(i=0;i<length;i++) cin>>heap[i];
for(i=length/2-1;i>=0;i--){ //build a max heap first with Θ(N)
while(!((i>=length/2)&&(i<length))){
j = 2*i+1;
rc = 2*i+2;
if((rc<length)&&(heap[j]<heap[rc])) j=rc;
if(heap[i]>heap[j]) break;
temp = heap[i];
heap[i]=heap[j];
heap[j]=temp;
i=j;
}
}
int k,n=length;
for(k=0;k<K;k++){ //shiftdown k times to find k biggest
temp1=heap[--n]; //numbers with Θ(klogN)
heap[n] = heap[0];
heap[0] = temp1;
if(n!=0) {
i=0;
while(!((i>=n/2)&&(i<n))){
j = 2*i+1;
rc = 2*i+2;
if((rc<n)&&(heap[j]<heap[rc])) j=rc;
if(heap[i]>heap[j]) break;
temp = heap[i];
heap[i]=heap[j];
heap[j]=temp;
i=j;
}
}
}
cout<<heap[length-K]<<endl;
for(i=0;i<length-K;i++)
cout<<heap[i]<<" ";
return 0;
}
没关系,但是其中一个数据是 Time Limit Exceed ,我对如何解决这个问题感到很困惑。