2015-10-06 76 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

相关问题