簡體   English   中英

如何解決 OJ 上的“運行時錯誤”

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM