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