Как насчет этого?
/**
* This method assumes input is valid!
* @param arr an ascending sorted list of factors of n
* @param n the factor
* @return a count of triplets
*/
public int countTriplets(int[] arr, int n)
{
Map<Long, Long> cnt = new HashMap<>();
Map<Long, Long> tots = new HashMap<>();
long count = 0;
for (long a : arr)
{
// Do only if a is divisible by r
if (a % r == 0)
{
long n = a / r;
count += tots.getOrDefault(n, 0L);
tots.put(a, tots.getOrDefault(a, 0L) + cnt.getOrDefault(n, 0L));
}
// Increment count of a.
cnt.put(a, cnt.getOrDefault(a, 0L) + 1);
}
return count;
}
Это однопроходное решение O (n). Базовая предпосылка такова: элемент может «видеть» количество значений, меньших, чем он сам, и возникших до него. Итак, читая элементы, отслеживайте, сколько элементов можно увидеть в данный момент, а сколько -. Подсчет представляет собой совокупность всех этих чисел.
--- Изменить: изменено после запуска в Hackerrank.