duplicatesCount
подсчитывается путем итерации всего массива для каждого элемента в массиве, то есть это квадратичное значение c.
Итак, для обработки массива из 73 966 элементов вы выполняете 5 470 969 156 сравнений. Это довольно много.
Map<Integer, Long> freqs = arr.stream().collect(groupingBy(a -> a, counting()))
будет гораздо более эффективным способом подсчета частоты каждого элемента. Это примерно так же, как:
Map<Integer, Long> freqs = new HashMap<>();
for (Integer i : arr) {
freqs.merge(i, 1L, Long::sum);
}
, то есть он просто увеличивает значение карты для каждого элемента в массиве.
Затем, похоже, что вы ищете наименьшее число с максимальная частота:
int minNum = 0;
long maxFreq = 0;
for (Entry<Integer, Long> e : freqs.entrySet()) {
if (e.getValue() > maxFreq) {
minNum = e.getKey();
maxFreq = e.getValue();
} else if (e.getValue() == maxFreq) {
minNum = Math.min(minNum, e.getKey());
}
}
return minNum;
Вы можете сделать это и с лямбдами:
return Collections.max(freqs.entrySet(),
Comparator.<Entry<Integer, Long>>comparingLong(Entry::getKey).thenComparing(Comparator.<Entry<Integer, Key>>comparingInt(Entry::getValue).reversed())).getKey();
, но я думаю, что императивный путь более ясен.
Это все работает за линейное время .