Algorithm 由于复杂性优于二次型,如何确定数组中是否有两个元素的和等于传递的值

Algorithm 由于复杂性优于二次型,如何确定数组中是否有两个元素的和等于传递的值,algorithm,Algorithm,我不确定我应该在这里问这个问题还是在数学上问这个问题,但我有一个解决这个问题的方法,我想知道为什么它真的有效。 给定一个值数组,设计一个比n^2更好的算法,以确定数组是否包含两个元素,它们的和等于传递的值s e、 对于数组{5,9,1,3}s=6返回true,s=7返回false 我认为这里的复杂性是nlogn表示排序+n表示连续排序 搜索=nlogn 你知道为什么会这样吗?这背后有什么数学理论吗?通过从所有值中减去s/2,你可以将问题转化为找到和为0的对(如果a+b=s,那么(a-s/2)+(

我不确定我应该在这里问这个问题还是在数学上问这个问题,但我有一个解决这个问题的方法,我想知道为什么它真的有效。 给定一个值数组,设计一个比n^2更好的算法,以确定数组是否包含两个元素,它们的和等于传递的值s

e、 对于数组{5,9,1,3}s=6返回true,s=7返回false

我认为这里的复杂性是nlogn表示排序+n表示连续排序 搜索=nlogn


你知道为什么会这样吗?这背后有什么数学理论吗?

通过从所有值中减去s/2,你可以将问题转化为找到和为0的对(如果a+b=s,那么(a-s/2)+(b-s/2)=s-s/2-s/2=0),这意味着找到绝对值相同但符号不同的值。按绝对值排序将使所述值彼此相邻

请注意,这意味着,除非您将其转录错误,否则该算法不起作用,因为它正在查找与s/2相加的相邻值


此外,示例中步骤1的结果应该是{2,6,-2,0},使步骤2{0,-2,2,6},它没有与s/2求和的相邻对,但有一个与0求和的相邻对。

此任务可以用O(n)时间复杂度解决,但需要额外的O(n)内存空间。其思想是将数组元素放入某种哈希表中,并在循环中验证哈希表是否包含s-i元素。这里是C#实现

公共静态bool ExistsPairSum(int[]数组,int s)
{
var dict=新哈希集(数组);
foreach(数组中的变量i)
{
if(dict.Contains(s-i))
返回true;
}
返回false;
}

解决方案示例中有一个错误:1)减去s/2,因此数组变为{2,6,-2,1}。正如@ScottHunter在他的回答中所注意到的,在排序中应该有两个符号不同但值相同的元素,所以第3点也不正确。@A.Chubarov:事实上,它是{2,6,-2,0}。@ScottHunter,是的,我的错。主要的一点是,在第二步,它将有连续的-2,2,这允许我们恢复原始值,这给了我们一个总和=6:5+1。如果存在两对绝对值相等的对,并且它工作了,我确实修改了它以返回真值,这有助于注意它们必须具有相等的绝对值,但也必须具有相反的符号:它们必须总和为0。
solution for s = 6
1)  Subtract s/2 thus the array become {2,6,-1,1}

2)  Sort based on absolute values in non-decreasing order, it become {-1,1,2,6}

3)  Search if there two consecutive numbers their sum = s/2 then the algorithm return true (in this case 1 + 2 = s/2 thus true)