Θ(N+klogN)
オンラインジャッジで、時間計算量のあるN個の要素の順序付けられていないセットからk個の最大要素を見つける関数を設計したいと思います。
ここにサンプルがあります:
入力
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;
}
大丈夫ですが、データの1つがTime Limit Exceedです。この問題を解決する方法に、私はとても混乱しています。