在一个数组中查找求和为k的两个元素

Find two elements in an array that sum to k

本文关键字:两个 元素 一个 数组 查找 求和      更新时间:2023-10-16

可能重复:
给定两个数组a和b。找到所有元素对(a1,b1(,使得a1属于数组a,b1属于数组b,其和a1+b1=k。

给定:整数的未排序数组A
输入:一个整数k

输出:所有两个元素集,每组元素之和等于O(n(中的k

示例:

A = {3,4,5,1,4,2}

输入:6
输出:{3,3}, {5,1}, {4,2}

注意:我知道一个O(nlogn(解决方案,但这需要对数组进行排序。有什么方法可以在O(n(中解决这个问题吗。可以使用非平凡的C++数据结构,即在空间上没有边界

制作一个常量时间查找表(hash(,以便查看数组(O(n((中是否包含特定整数。然后,对于阵列中的每个元素,查看是否包括k-A[i]。对于每个元素,这需要恒定的时间,因此总共需要O(n(时间。这假设元素是不同的;使其与重复元素一起工作并不困难。

只是我脑海中浮现的一个简单算法:

  • 创建一个位字段,表示从0到k的数字,标记为B
  • 对于A中的每个数字i
    • 集合B[i]
    • 如果设置了B[k-i],则将(i,k-i(添加到输出

现在,正如人们所提出的,如果你需要有两个数字3的实例来输出(3,3(,那么你只需要在上面的算法中切换最后两个语句的顺序。

此外,我相信这个算法有一个名字,或者至少有更好的名字,所以如果有人知道的话,我会很感激你的评论。

http://codepad.org/QR9ptUwR

这将打印所有配对。算法与上面@bdares所说的相同。

我使用了stl映射,因为stl中没有哈希表。

可以减少

元素唯一性位

对此。无O(n(。

有k对整数和为k:{0,k},{1,k-1}。。。等等。创建一个大小为k+1的数组B,其中元素是布尔值。对于阵列A的每个元素e,如果e<=k&amp;B[e]=false,设置B[e]=true,如果B[k-e]=true,则发射对{e,k-e}。对于负整数,需要稍微扩展一下。