如何有效地找到总和等于指定数字的数组中的两个数字?

时间:2014-01-07 17:35:54

标签: algorithm

我想办法解决问题,其中包含以下代码:

package samueg.algorithm;

public class Main {

    public static void main(String[] args) {
        int[] numbers = new int[] { -1, 3, 7, 2, 4, 5, -8, 9 };
        int sum = 14;
        int targetIndex1 = -1, targetIndex2 = -1;
        for (int i = 0; i < numbers.length; ++i) {

//          for (int j = 0; j < i; ++j) {
//              if (numbers[i] + numbers[j] == sum) {
//                  targetIndex1 = i;
//                  targetIndex2 = j;
//                  break;
//              }
//          }

            for (int j = (i + 1); j < numbers.length; ++j) {
                if (numbers[i] + numbers[j] == sum) {
                    targetIndex1 = i;
                    targetIndex2 = j;
                    break;
                }
            }

            if (targetIndex1 != -1 && targetIndex2 != -1) {
                System.out.println(String.format("%1$d + %2$d = %3$d",
                        numbers[targetIndex1], numbers[targetIndex2], sum));
                return;
            }
        }

        System.out.println("No targets which satisfy the condition are found.");

    }

}

评论代码不是必需的,因为他们所做的判断已经为索引i完成了。 我想知道这个算法是否有效,如果不是,有人能告诉我一个更好的算法吗?感谢。

2 个答案:

答案 0 :(得分:3)

使用哈希表:

对于每个号码n

  • 检查哈希表中是否有target number - n。如果是,我们发现两个数字相加到目标数字。

  • n插入哈希表。

复杂性:预期O(n)(由于循环加倍,您的方法为O(n2)

答案 1 :(得分:1)

对数组进行排序,设置两个指针并分别移动它们。这应该给你一个O(n log(n))解决方案。我不擅长java,所以让我python:

def find_indexes(A, s):
    A = sorted(A)
    p1 = 0
    p2 = len(A) - 1
    while not A[p1] + A[p2] == s and p1 < len(A) and p2 >= 0:
        if A[p1] + A[p2] < s:
            p1 = p1 + 1
        if A[p1] + A[p2] > s:
            p2 = p2 - 1
    if A[p1] + A[p2] == s:
        return (p1,p2)
    return None