【问题标题】:java based algorithm to find if there are any 2 numbers in the array whose sum is equal to x [duplicate]基于java的算法来查找数组中是否有任何2个数字的总和等于x [重复]
【发布时间】:2014-09-25 11:30:13
【问题描述】:
我最近遇到了一个有趣的 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;
}
}
}
任何指针?
【问题讨论】:
标签:
java
arrays
algorithm
time-complexity
【解决方案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;
}
【解决方案2】:
如果我们假设数组已经排序,你可以这样做:
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;
【解决方案3】:
我认为 O(n) 预期的解决方案是 HashMap。添加和测试 n 个值是 O(n) 或接近。
PS:尽管我被否决了,但我坚持自己的回答。
好吧,也许我应该解释一下算法:对于每个 a[i],检查 (x-a[i]) 是否在 HashMap 中。如果是,你就完成了。如果没有,将 a[i] 添加到 HashMap 并继续。