当前位置: 首页 > 知识库问答 >
问题:

如何在无序数组中找到2个数字及其总和

宋飞文
2023-03-14

这是我被要求回答的一个面试问题:给定一个未排序的数组,找出数组中的两个数字及其和。(也就是说,在数组中找到三个数字,其中一个是其他两个数字的和。)请注意,当求和(int k)时,我看到了关于寻找2个数字的问题。然而,这个问题要求你找出数组中的数字和和。可以用O(n)、O(logn)或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);
            }
        }
    }
}

共有2个答案

酆耀
2023-03-14

你可以在O(nlog(n))中解决,如下所示:

O(nlog(n))中对数组进行升序排序。需要两个指向数组左/右端的索引。我们把它们叫做iji是左边的,而j是右边的。

现在计算数组[i]数组[j]的和。

  • 如果该总和大于k,则将j减少一
  • 如果此总和小于k。将i增加一

重复,直到总和等于k

因此,使用该算法,您可以在O(nlog(n))中找到解决方案,而且实现起来非常简单

很抱歉看来我没有仔细阅读你的帖子;)

欧阳昊阳
2023-03-14

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

您的解决方案是O(n^2 lg n);有基于数组排序的O(n^2)算法,对这个变体稍加修改即可工作。最著名的下界是O(n lg n)(因为如果你聪明的话,你可以用它来执行比较排序)。如果你能找到一个次二次算法或更紧的下界,你会从中得到一些出版物。:)

请注意,如果您愿意将整数限制在[-u, u]的范围内,那么a b c=0问题可以使用快速傅里叶变换在时间上解决O(n u lg u)问题。不过,我不知道如何将它调整到a b=c问题。

 类似资料:
  • 问题内容: 给定一个数组,如何找到其元素的总和?(在这种情况下,总和为。) 我认为可能有用,但是我不确定如何实现它。 问题答案: 推荐(减少默认值) Array.prototype.reduce可用于遍历数组,将当前元素值添加到先前元素值的总和中。 没有默认值 您收到TypeError 在ES6的箭头功能之前 非数字输入 如果非数字是可能的输入,您可能要处理呢? 不建议危险的评估使用 我们可以使用

  • 问题内容: 如何找到最多2个数字? 我需要比较两个值,即,并找到最大值2。我需要一些python函数来操作它吗? 问题答案: 使用内置功能。 示例: 返回4。 只是为了傻笑,还有一个……您是否需要它。:P

  • 现在我要为每个学生找到总分和最高分。(一名学生的最高分是指他/她在哪一个学期获得最高分,也是指该学生的总分=第一学期+第二学期)。但我不知道我会怎么写,如果有人能帮助我,我会很感激他。

  • 我试图学习分布式计算,并遇到了一个寻找大量数字的中位数的问题: 假设我们有一大组数字(假设元素数为 N*K),它们无法放入内存(大小为 N)。我们如何找到这些数据的中位数?假设在内存上执行的操作是独立的,即我们可以考虑有K台机器,每台机器最多可以处理N个元素。 我认为中位数可以用于这个目的。我们可以一次将N个数装入内存。我们在< code>O(logN)时间内找到该集合的中值,并保存它。 然后我们

  • 本文向大家介绍在C ++中找到一个数字X,其数字之和等于N,包括了在C ++中找到一个数字X,其数字之和等于N的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将找到一个数字,其中一些(包括其数字)等于给定的数字N。 这个想法很简单,我们将检查给定数字的左右100个数字。N≤1000000000且总和不超过100不会被限制。 让我们看看解决问题的步骤。 初始化号码。 编写一个循环100次的

  • 我有一个数组,我需要三个数中最大的一个数和各自的索引值。我有一个这样的数组: 如何找到最大的数字及其索引值?