2015-10-06 79 views
-3

如何查找n項列表中的任何項目是否被重複超過n/2次。我希望它很快,所以它應該是O(nlogn),這裏是踢球者:你只能檢查項目是否相等,沒有別的。即時有一個很難做的比Ø更好的(N^2)查找是否有超過n/2個項目在n個項目列表中匹配。 O(nlog(n))

+0

使用[博耶-摩爾多數票算法(https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_majority_vote_algorithm),如描述在對建議重複的各種答案中。算法是O(n),超出您的規格。如果您不知道最常見的元素是多數元素,則需要進行第二次掃描以計算boyer-moore算法找到的元素的出現次數。 – rici

回答

0

如果你只能檢查平等那麼這裏是一個O(nlogn)解決方案:

  • 排序列表中O(nlogn)時間
  • 設中間元素爲排序後的數組中的m
  • 現在,如果有一個重複超過n/2次的元素,它只能是m。所以現在可以通過迭代到中間索引的右側和中間索引的左側來檢查m的頻率。如果它超過n/2你找到了答案,否則該元素不存在。

如果您可以做的不僅僅是檢查相等性,還可以通過數組並將元素的頻率存儲在HashMap中,然後檢查頻率是否大於n/2。該解決方案的時間複雜度爲O(n)

代碼O(n)溶液HashMap中:

public int getDuplicated(List<Integer> a) { 
    HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); 
    int n = a.size(); 
    for (int i = 0; i < a.size(); i++) { 
     if (map.containsKey(a.get(i))) { 
      // increasing the frequency 
      map.put(a.get(i), map.get(a.get(i)) + 1); 
     } else { 
      map.put(a.get(i), 1); 
     } 
     if (map.get(a.get(i)) > n/2) { 
      // element found 
      return a.get(i); 
     } 
    } 
    // returning -1 if could not find the element 
    return -1; 
} 
+0

除非可以進行排序比較,否則無法排序;平等比較是不夠的。另一方面,哈希映射不需要有序比較,但它確實需要能夠操縱項目而不僅僅是比較。 – rici

相關問題