在一个数组中查找求和为k的两个元素
Find two elements in an array that sum to k
可能重复:
给定两个数组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&;B[e]=false,设置B[e]=true,如果B[k-e]=true,则发射对{e,k-e}。对于负整数,需要稍微扩展一下。
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 高级选择排序 - 在一次迭代中搜索两个元素
- 如何仅考虑 *指针中的前两个元素
- 为什么具有两个元素的发起器语法将一个元素而不是两个元素放入字符串向量中?
- 是否可以交换在 c++ 中作为函数 func(say) 中的参数传递的 const 向量的两个元素,例如:vector<int>func (const vector<int>&
- C++ std::向量插入两个元素替代算法失败
- 数组中两个元素的最大异或
- 我无法将二维数组的两个元素的差异分配给C++中其他数组的元素?
- 一个数组可以划分的最大子数组,使得不同子数组中任意两个元素的 GCD 始终为 1?
- 找到两个相关索引,其中两个元素等于目标值
- C++ - 前两个元素之间的差异
- C :交换两个不同向量的两个元素
- C 查找两个元素中出现的次数的数量
- 如何连接向量的两个元素
- 使用STL仅对两个元素进行排序
- 使用STL交换静态数组中的两个元素
- OpenGL:在两个元素之间画一条线
- C++矢量迭代器:比较和擦除两个元素
- 试图将字符串的两个元素组合在一起会得到错误的结果(c++)
- 由 8 个或更多位置分隔的数组中两个元素的最大乘积