[英]How can I solve "Runtime Error" on OJ
我正在嘗試解決 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
你的代碼是錯誤的。 忽略對size
的模棱兩可的調用(將其稱為其他名稱,例如 mysize),您似乎在代碼中的某處越界了。
在您的示例中, N
等於 19,因此您的maxHeap
數組應該從 0 索引到 19-1=18。
但是,例如,在這里,您可以訪問它 19:
for ( pos; maxHeap[pos / 2] <= item; pos /= 2 )
maxHeap[pos] = maxHeap[pos / 2];
如果您不相信我,請在循環體中添加pos
的打印語句。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.