基于java的算法,用于查找数组中是否有任何2个数字,其总和等于x

时间:2014-09-25 11:30:14

标签: java arrays algorithm time-complexity

我最近遇到了一个有趣的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.

提示:以3种方式解决它,具有以下复杂性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 个答案:

答案 0 :(得分:1)

这是一个基于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;
  }

答案 1 :(得分:0)

我认为O(n)预期的解决方案是HashMap。添加和测试n值是O(n)或接近。

PS:尽管事实上我被投票了,但我坚持自己的答案。

好吧,也许我应该解释一下算法:对于每个a [i],检查(x-a [i])是否在HashMap中。如果是的话,你就完成了。如果没有,请将[i]添加到HashMap并继续。

答案 2 :(得分:0)

如果我们假设数组已经排序,您可以执行以下操作:

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;