找到总和为k的数组中的两个元素

时间:2011-04-12 04:18:39

标签: c++ arrays algorithm

  

可能重复:
  Given two arrays a and b .Find all pairs of elements (a1,b1) such that a1 belongs to Array A and b1 belongs to Array B whose sum a1+b1 = k .

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

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

示例:

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

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

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

5 个答案:

答案 0 :(得分:18)

创建一个恒定时间查找表(哈希),以便查看数组中是否包含特定的整数(O(n))。然后,对于数组中的每个元素,查看是否包含k-A[i]。这需要每个元素保持恒定的时间,因此总共有O(n)时间。这假设元素是不同的;使重复元素发挥作用并不困难。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

只是一个简单的算法:

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

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

此外,我确信这个算法有一个名称,或者至少有一个更好的名称,所以如果有人知道我会赞赏你的评论。

答案 3 :(得分:1)

http://codepad.org/QR9ptUwR

这将打印所有对。该算法与@bdares上述的算法相同。

我使用过stl贴图,因为我们在STL中没有哈希表。

答案 4 :(得分:1)

可以减少,

元素唯一性位,

对此。没有O(n)。