【问题标题】:How to find 2 numbers and their sum in an unsorted array如何在未排序的数组中找到 2 个数字及其总和
【发布时间】:2012-07-27 04:40:44
【问题描述】:

这是我被要求解决的一个面试问题:给定一个未排序的数组,找出数组中的 2 个数字及其总和。 (也就是说,在数组中找到三个数字,其中一个是另外两个的总和。)请注意,我已经看到了关于在给定总和 (int k) 时找到 2 个数字的问题。但是,这个问题希望您找出数组中的数字和总和。是否可以在 O(n)、O(log n) 或 O(nlogn) 中求解

有一个标准的解决方案是遍历每个整数,然后对其进行二进制搜索。有没有更好的解决方案?

public static void findNumsAndSum(int[] l) {
    // sort the array
    if (l == null || l.length < 2) {
        return;
    }
    BinarySearch bs = new BinarySearch();
    for (int i = 0; i < l.length; i++) {
        for (int j = 1; j < l.length; j++) {
            int sum = l[i] + l[j];
            if (l[l.length - 1] < sum) {
                continue;
            }
            if (bs.binarySearch(l, sum, j + 1, l.length)) {
                System.out.println("Found the sum: " + l[i] + "+" + l[j]
                        + "=" + sum);
            }
        }
    }
}

【问题讨论】:

  • 如果没有给出k,那么……任务是什么?我不明白...你能举个例子吗(输入+预期输出)?
  • 任务是在数组中找到三个数字,使得三个数字中的一个是另外两个的和。

标签: algorithm


【解决方案1】:

这与标准问题3SUM 非常相似,右侧的许多相关问题都与该问题有关。

您的解决方案是O(n^2 lg n);有O(n^2) 算法based on sorting the array,可以对这个变体进行轻微修改。最有名的下限是O(n lg n)(因为你可以用它来执行比较排序,如果你很聪明的话)。如果你能找到一个二次算法或更严格的下限,你会从中得到一些出版物。 :)

请注意,如果您愿意将整数限制在[-u, u] 范围内,则可以使用Fast Fourier Transform 及时解决a + b + c = 0 问题O(n + u lg u)。不过,如何将其调整为 a + b = c 问题对我来说并不是很明显。

【讨论】:

  • 我们可以假设这个数字是正数。我仍然看不到我们如何实现 O(n lg n)
  • @masti 请参阅my answer here 了解大部分解决方案,尽管它并没有完全实现。
【解决方案2】:

你可以在O(nlog(n))解决如下:

按升序对O(nlog(n)) 中的数组进行排序。您需要 2 个指向数组左/右端的索引。让我们称他们为iji 是左边,j 是右边。

现在计算array[i] + array[j] 的总和。

  • 如果此总和大于 k,则将 j 减一。
  • 如果这个总和小于k。将i 加一。

重复直到总和等于k

所以用这个算法你可以在O(nlog(n))找到解决方案,实现起来非常简单

对不起。看来我没有仔细阅读您的帖子;)

【讨论】:

    猜你喜欢
    • 2012-03-28
    • 1970-01-01
    • 2017-06-06
    • 2010-11-16
    • 1970-01-01
    • 2022-09-22
    • 1970-01-01
    • 2018-06-29
    相关资源
    最近更新 更多