Скажем, у меня есть классическая проблема двух сумм, но с изюминкой
Если мне дан список целых чисел и цель
Мне нужно напечатать все пары значений, которые складываются в сумму
Без повторяющихся симметричных значений
Без повторного использования значения
Я пытаюсь избежать подхода грубой силы по очевидным причинам, но если я реализую хеш-карту с каждым значением в качестве ключа, а элемент является частотой этого значения в исходном массиве. Как заставить алгоритм печатать каждую пару значений только один раз?
function findPairs(arr, target){
let hashMap = {};
let results = [];
for(let i = 0; i < arr.length; i++){
if(hashMap.hasOwnProperty(arr[i])){
hashMap[arr[i]]++;
}else{
hashMap[arr[i]] = 1;
}
}
for(let i = 0; i < arr.length; i++){
let diff = target - arr[i];
if(hashMap.hasOwnProperty(diff) && hashMap[diff] > 0){
results.push([arr[i], diff]);
hashMap[diff]--;
}
}
console.log(results);
}
findPairs([1, 3, -1, 11, 7], 10);
findPairs([5, 5, 5, 5, 5], 10);
findPairs ([1, 3, -1, 11, 7], 10)
(3, 7)
(-1, 11)
findPairs ([5, 5, 5], 10)
(5, 5)
findPairs ([5, 5, 5, 5], 10)
(5, 5)
(5, 5)
findPairs ([5, 5, 5, 5, 5], 10)
(5, 5)
(5, 5)
findPairs ([5, 5, 5, 5, 5, 5], 10)
(5, 5)
(5, 5)
(5, 5)