Как мне учесть дубликаты значений при решении проблемы двух сумм с использованием хеш-таблицы? - PullRequest
1 голос
/ 28 марта 2019

Скажем, у меня есть классическая проблема двух сумм, но с изюминкой

Если мне дан список целых чисел и цель

Мне нужно напечатать все пары значений, которые складываются в сумму

Без повторяющихся симметричных значений

Без повторного использования значения

Я пытаюсь избежать подхода грубой силы по очевидным причинам, но если я реализую хеш-карту с каждым значением в качестве ключа, а элемент является частотой этого значения в исходном массиве. Как заставить алгоритм печатать каждую пару значений только один раз?

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)

1 Ответ

1 голос
/ 28 марта 2019

Насколько я понял, это краткое изложение вопроса:

  • Ваш массив может содержать повторяющиеся элементы, например: - [1, 2, 3, 2, 4]
  • Вы хотите напечатать дубликаты [4, 1, 2, 3, 2, 4] как (2, 4), (2, 4)

    vector<pair<int, int> > findPairs(vector<int> arr, int target){
        int size = arr.size();
        map<int, int> hashMap;
    
        for(int i = 0; i < size; i++){
                // C++ map assigns 0 as default if the key is not present, C++ map uses Red Black Tree 
                if(hashMap[arr[i]] == 0)
                        hashMap[arr[i]] = 1;
                else
                        hashMap[arr[i]]++;
        }
        /** Use to store result in (int, int) form
         *  Vector is a Dynamic array
         */
        vector<pair<int, int> > results;
        for(int i = 0; i < size; i++){
                int diff = target - arr[i];
                hashMap[arr[i]]--;
                if(hashMap[diff] >= 1)
                        results.push_back(make_pair(arr[i], diff));
                hashMap[diff]--;
        }
        return results;
    

    }

Этот код основан на примерах, которые вы предоставили в вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...