这是我被要求回答的一个面试问题:给定一个未排序的数组,找出数组中的两个数字及其和。(也就是说,在数组中找到三个数字,其中一个是其他两个数字的和。)请注意,当求和(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);
}
}
}
}
你可以在O(nlog(n))
中解决,如下所示:
在O(nlog(n))
中对数组进行升序排序。需要两个指向数组左/右端的索引。我们把它们叫做i
和j
,i
是左边的,而j
是右边的。
现在计算数组[i]数组[j]
的和。
k
,则将j
减少一
k
。将i
增加一
重复,直到总和等于k
。
因此,使用该算法,您可以在O(nlog(n))
中找到解决方案,而且实现起来非常简单
很抱歉看来我没有仔细阅读你的帖子;)
这非常类似于标准问题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次的
我有一个数组,我需要三个数中最大的一个数和各自的索引值。我有一个这样的数组: 如何找到最大的数字及其索引值?