Как эффективнее найти количество пар, чем O(n^2)
Задача: Дан массив натуральных чисел a
. Найдите количество таких пар элементов (a_i, a_j)
, где abs(a_i − a_j) mod 200 == 0
и i < j
Я придумал такое решение:
// n - the length of numbers array
// numbers - the array of natural numbers
function getNumberOfGoodPairs(n, numbers) {
let count = 0;
const remainders = new Map();
for (const num of numbers) {
const remainder = num % 100;
const modifiedNum = (num - remainder) / 100;
if (remainders.has(remainder)) {
const nums = remainders.get(remainder);
for (const num of nums) {
if (Math.abs(num - modifiedNum) % 2 === 0) ++count;
}
nums.push(modifiedNum);
} else {
remainders.set(remainder, [modifiedNum]);
}
}
return count;
}
Обозначения:
for (const arrayElement of array)
- получает элементы изarray
один за другим и помещает этот элемент вarrayElement
. Это то же самое, что:for (let i = 0; i < array.length; ++i) { const arrayElement = array[i]; }
new Map()
- это словарь%
- этоmod
array.push(el)
- добавляетel
В конецarray
remainders.get(remainder)
- возвращает массив чисел, остаток которых равенremainder
при делении на 100remainders.set(remainder, [modifiedNum])
- добавляет в словарь новый ключremainder
и значение[modifiedNum]
.[modifiedNum]
- динамический массив с одним элементомmodifiedNum
Если я прав, временная сложность в худшем случае будет O(n^2)
Пожалуйста, помогите мне оптимизировать этот алгоритм. Вы можете предоставить псевдокод для объяснения вашего алгоритма