Учитывая массив, как найти число пар (два значения), которые складываются до 60, или значение, кратное 60. Примечание. Должно быть быстрее, чем O (N ^ 2).
Ввод: [10, 50, 30, 90]
Выход: 2
Обоснование: 10 + 50 = 60, 30 + 90 = 120 (120 делится на 60)
Ввод: [60,60,60]
Выход: 3
Обоснование: 60 + 60 = 120, 60 + 60 = 120, 60 + 60 = 120
Код, который я имею ниже, будет выполняться за O (N) времени, но я не знаю, как позаботиться о парах, которые равны друг другу (т.е. если у вас есть 2 30 значений в массиве, которые добавят 1 к вашему счетчику, но если у вас есть 3 30 значений в массиве, это добавит 3 к вашему счетчику). Я подумал, что мне следует создать комбинированную функцию (то есть 2C2 или 3C2), но это линейная функция, и разве это не вернет функцию к O (N ^ 2)?
values(myList) {
var obj = {};
var count = 0;
// loop through array and mod each value and insert it into a dictionary
myList.forEach((elem, index) => {
if (!obj.hasOwnProperty(elem % 60)) {
obj[elem % 60] = 1;
} else {
obj[elem % 60]++;
}
});
for (var keys in obj) {
if (obj.hasOwnProperty(60 - keys)) {
if (60 - keys == keys) {
// take care of pairs
// obj[keys] = x --> xC2
} else {
count += Math.min(obj[keys], obj[60 - keys]);
delete obj[keys]
delete obj[60 - keys];
}
}
}
return count;
}