我最近遇到了一个有趣的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;
}
}
}
任何指针?
答案 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;