查找n个项目列表中是否有超过n / 2个项目匹配。 O(n日志(n))的

时间:2015-10-06 23:04:20

标签: arrays algorithm sorting

如何查找n个项目列表中的任何项目是否重复多次n / 2次。我希望它很快,所以它应该是O(nlogn)并且这里是踢球者:你只能检查物品是否相等,没有别的。我比O(n ^ 2)

做得更好

1 个答案:

答案 0 :(得分:0)

如果您只能检查相等性,那么这里是O(nlogn)解决方案:

  • O(nlogn)时间
  • 中对列表进行排序
  • 让中间元素在排序数组中为m
  • 现在,如果有一个元素的重复次数超过n/2次,那么它只能是m。所以现在你可以通过迭代到中间索引的右边和中间索引的左边来检查m的频率。如果它超过n/2您找到了答案,否则该元素不存在。

如果您不仅要检查相等性,还可以通过数组并将元素的频率存储在HashMap中,然后检查频率是否超过n/2。此解决方案的时间复杂度为O(n)

使用HashMap的O(n)解决方案的代码:

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;
}