给定:整数的未排序数组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 ++数据结构,即空间没有界限
答案 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)
只是一个简单的算法:
现在正如人们提出的那样,如果你需要输出数字3的两个实例来输出(3,3),那么你只需要切换上述算法中最后两个语句的顺序。
此外,我确信这个算法有一个名称,或者至少有一个更好的名称,所以如果有人知道我会赞赏你的评论。
答案 3 :(得分:1)
答案 4 :(得分:1)
可以减少,
元素唯一性位,
对此。没有O(n)。