簡體   English   中英

由於我的黑客級別解決方案超時而終止

[英]Terminated due to timeout for my hacker rank solution

大家好,請檢查HackerRank問題陳述的問題

這是我對上述問題的解決方案(鏈接)

static int migratoryBirds(List<Integer> arr) {
    int ar[]=new int[arr.size()];
    for(int i=0;i<arr.size();i++){
        ar[i] = Collections.frequency(arr,arr.get(i));
        // ar[i] = obj.occuranceOfElement(arr,arr.get(i));
    }
    int maxAt = 0;
    for (int i = 0; i < ar.length; i++) {
        maxAt = ar[i] > ar[maxAt] ? i : maxAt;
    }
    return arr.get(maxAt);
}

當數組大小較大時,我的代碼無法處理,例如數組中的17623個元素

由於超時而終止

問題出現在第二個for循環中,它迭代數組並給出數組中最大數字的索引。 有沒有其他方法可以提高性能。

您的問題是調用Colletions.frequency,這是一個O(N)操作。 當你從一個循環內部調用它時它變成O(N²)並消耗你所有的時間。

另外,您確定收到List的哪個列表? 如果實現是LinkedList,則調用list.get(i),它也可能是O(N)。

本練習的目標是計算輸入中一次傳遞中每個值的頻率。 您需要一個存儲位置並增加每個值的出現次數,並且需要存儲輸入的最大值。

您還跳過了規范的關鍵部分。 輸入有限制,這使得解決問題比您現在想象的更容易。

你的問題在這部分:

for(int i = 0; i < arr.size(); i++)
    ar[i] = Collections.frequency(arr, arr.get(i));

這是O(N²)Collections.frequency()遍歷整個列表以僅計算一個元素的頻率。 手動,您可以遍歷列表以計算所有元素的頻率。

而且,只有5只鳥,所以你只需要5個長度陣列。

static int migratoryBirds(int[] arr) {
    int max = 1;
    int[] freq = new int[6];

    for (int val : arr)
        freq[val]++;

    for (int i = 2; i < freq.length; i++)
        max = freq[i] > freq[max] ? i : max;

    return max;
}

這是另一個:

static int migratoryBirds(List<Integer> arr) {
    int freq[]=new int[6];
    for(int i=0;i<arr.size();i++){
        ++freq[arr.get(i)];
    }
    int maxAt = 1;
    for (int i = 2; i < freq.length; i++) {
        if (freq[i] > freq[maxAt]) {
            maxAt = i;
        }
    }
    return maxAt;
}

我們可以在一個循環中確定最常見鳥類的類型編號 這具有時間復雜度O(n)。

static int migratoryBirds(int[] arr) {
    int highestFrequency = 0;
    int highestFrequencyBirdType = 0;
    int[] frequencies = new int[5]; // there are 5 bird types

    for (int birdType : arr) {
        int frequency = ++frequencies[birdType - 1];
        if (frequency > highestFrequency) {
            highestFrequency = frequency;
            highestFrequencyBirdType = birdType;
        } else if (frequency == highestFrequency && birdType < highestFrequencyBirdType) {
            highestFrequencyBirdType = birdType;
        }
    }

    return highestFrequencyBirdType;
}

對於數組arr中的每個元素,我們更新整體的highestFrequency並存儲表示highestFrequencyBirdType的相應值。 如果兩種不同的鳥類型具有最高頻率,則設置較低類型( 具有最小ID號 )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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