【问题标题】: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 并继续。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-11-30
        • 2018-07-31
        • 2018-04-19
        • 1970-01-01
        • 2011-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多