我正在尝试解决OJ上的经典TOP K问题:给定一个数组,计算最大的K数并按升序输出它们。 我的解决方案是构建一个MAX ROOT HEAP,并删除K次。当我把它们放在OJ上时,它告诉我"运行时错误"并给了我正确的输入和输出。但我下载输入文件并在我自己的PC上测试,这是正确的。那么我的代码有什么问题?是否有任何非法操作导致"运行时错误"?
#include <iostream>
using namespace std;
long long N,K;
long long * maxHeap;
long long size = 0;
void insertItem(long long * maxHeap)
{
long long item;
cin >> item;
long long pos = ++size;
for ( pos; maxHeap[pos / 2] <= item; pos /= 2 ) maxHeap[pos] = maxHeap[pos / 2];
maxHeap[pos] = item;
}
long long deleteItem(long long * maxHeap)
{
long long max_item = maxHeap[1];
long long item = maxHeap[size--];
long long parent = 1;
long long child;
for ( parent; parent * 2 <= size; parent = child ) {
child = parent * 2;
if ( child < size && maxHeap[child] < maxHeap[child + 1] ) child++;
if ( item > maxHeap[child] ) break;
else maxHeap[parent] = maxHeap[child];
}
maxHeap[parent] = item;
return max_item;
}
int main()
{
// freopen("F://input.txt","r",stdin);
cin >> N;
maxHeap = new long long[N];
maxHeap[0] = 1000000000;
for ( long long i = 0; i < N; i++ ) insertItem(maxHeap);
cin >> K;
for ( long long i = 0; i < K; i++ ) cout << deleteItem(maxHeap) << endl;
delete[] maxHeap;
return 0;
}
OJ的输入样本下载: 19 11 2132 45 445 654 34 44 5645 68 455 32 56 51 63 47 453 554 655 761 10
输出: 5645 2132 761 655 654 554 455 453 445 68
答案 0 :(得分:1)
你的代码错了。忽略对size
的模糊调用(称之为其他内容,例如mysize),似乎你在代码中的某个地方出了界限。
在您的示例中,N
等于19,因此您的maxHeap
数组应该从0到19-1 = 18进行索引。
但是,例如,您可以在此处访问19:
for ( pos; maxHeap[pos / 2] <= item; pos /= 2 )
maxHeap[pos] = maxHeap[pos / 2];
如果您不相信我,请在循环体中添加pos
的打印声明。