如何查找n个项目列表中的任何项目是否重复多次n / 2次。我希望它很快,所以它应该是O(nlogn)并且这里是踢球者:你只能检查物品是否相等,没有别的。我比O(n ^ 2)
做得更好答案 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;
}