如果要通过列表中的固定次数进行此操作,则需要第二个数据结构。
如果该集合中的值有上限和下限,并且这些值相对密集,则计数器数组是一个很好的解决方案。
否则,最好使用Map<Integer, Integer>
,其中键是集合的元素,而值是计数器。
如果在开始之前没有上限/下限,那么您就不知道要分配的大量计数器。因此,您必须对数组进行初步遍历以找到边界…,现在有了两遍解。
如果您确实有上限和下限,但集合稀疏,则初始化计数数组的成本+找到三个最大计数的成本将主导计算集合元素的成本。如果差异足够大(即输入很大且非常稀疏),则HashMap将更快并且占用更少的内存。
如果允许您更改数组,则可以按升序对其进行排序O(NlogN)
,然后在经过排序的数组上一次遍历即可找到三个最常见的元素。