Алгоритм на основе Java, чтобы найти, есть ли в массиве 2 числа, сумма которых равна х

Недавно я наткнулся на интересное утверждение алгоритма Java

Given an array int[] arr{} and a number x, find if there are any 2 numbers in the array whose sum is equal to x.

Подсказка: решите это тремя способами со следующими сложностями O(n^2), O(n log n) и O (n)

Подход O (n ^ 2) - это простая логика грубой силы. O (n log n) возможно включает в себя сортировку слиянием и использование бинарного поиска - хотя я могу точно выяснить, как вписаться в бинарный поиск здесь. Я совершенно не разбираюсь в алгоритме O (n).

Простая логика грубой силы:

for(i = 0; i < arr.length; i++){
    for(j=0; j<arr.length; j++){
       if(arr[i] + arr[j] == x){
         return x;
       }
    }
}

Есть указатели?

3 ответа

Решение

Вот решение на основе HashSet с n временной и пространственной сложностью.

 private static boolean twoNumbersInArraySumIsEqualToX(int[] input, int x) {
    //create HashSet and store each element as key from array
    Set<Integer> set =  new HashSet<Integer>();
    for (int elem_ : input) set.add(elem_);

    //Iterate through the array and find if (x - elem) exists in set
    for (int elem_ : input) {
      if(set.contains(x - elem_)) return true;
    }
    return false;
  }

Если мы предположим, что массив уже отсортирован, вы можете сделать следующее:

int i =0;
int j = arr.length-1;
while (i<j){
    if (arr[i]+arr[j]>x){
        j--;
        continue;
    }
    else if (arr[i]+arr[j]<x){
        i++;
        continue;
    }
    else { // arr[i]+arr[j]==x
        return true;
    }
}
return false;

Я думаю, что предполагаемое решение O(n) - это HashMap. Добавление и тестирование n значений - это O(n) или close.

PS: Несмотря на то, что за меня проголосовали, я поддерживаю свой ответ.

Хорошо, возможно я должен был объяснить алгоритм: для каждого a[i], проверьте, есть ли (xa[i]) в HashMap. Если да, то все готово. Если нет, добавьте [i] в ​​HashMap и продолжайте.

Другие вопросы по тегам