如何查找n项列表中的任何项目是否被重复超过n/2次。我希望它很快,所以它应该是O(nlogn),这里是踢球者:你只能检查项目是否相等,没有别的。即时有一个很难做的比Ø更好的(N^2)查找是否有超过n/2个项目在n个项目列表中匹配。 O(nlog(n))
-3
A
回答
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
相关问题
- 1. 查找列表中第n个项目的索引
- 2. 如何有效地找出一个序列是否至少有n个项目?
- 3. MS SQL,查看一个列表中的任何项目是否与另一个列表中的项目匹配
- 4. O(nlog * n)和O(n)之间?
- 5. 正则表达式 - 如何匹配列表中的至少n个项目
- 6. Linq匹配查找列中的项目与多个条目
- 7. 是否可以创建一个引用n个现有项目和一个新项目的多项目模板?
- 8. 查找多个列表中的匹配项,并根据4个项目中的3个组合匹配
- 9. 找到最后一个项目,但没有储存n个项目的流中的N为
- 10. 找到固定项目重复列表中的第n项
- 11. 从列表中有条件地删除N个项目
- 12. 查找与标准匹配的第一个序列项目
- 13. O(N)查找,但O(日志(N))的比较排序列表
- 14. 编辑列表中每个第N个项目的值
- 15. sed:是否有一个选项可以替换每行匹配的第N个和第M个匹配项?
- 16. 防止Django用户创建超过N个项目
- 17. 蟒蛇循环在列表中的n个连续项目
- 18. 每n个项目在收集在VB.Net
- 19. PostgreSQL的:每个项目的前N个项目在同一个表
- 20. 查找多个列表中的项目?
- 21. 代码O(nlog(n))的T(n)如何?
- 22. Sed替换第n个匹配项
- 23. 如何在nongodb中从n到n个项目
- 24. Sass在第N个项目循环
- 25. 查找第n个fib数,在O(logn)
- 26. 检查项目是否在列表中并删除旧项目
- 27. 要删除的项目“\ n”不匹配正则表达式
- 28. 如何重新排序Python列表中的每N个项目
- 29. Python列表中第n个最大项目的索引
- 30. 列表中的第n个项目到字典python
使用[博耶-摩尔多数票算法(https://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_majority_vote_algorithm),如描述在对建议重复的各种答案中。算法是O(n),超出您的规格。如果您不知道最常见的元素是多数元素,则需要进行第二次扫描以计算boyer-moore算法找到的元素的出现次数。 – rici