在这个问题中,我们有一个未排序的数组,我们必须打印该数组中所有具有相等总和的对。
让我们以一个例子来了解问题-
Input: array = [12, 13, 20, 5] Output: [12, 13] and [20, 5] have sum 25.
为了解决这个问题,我们将必须找到相同总和的对。为此,我们将检查对是否有相同的总和。为了避免重复对,我们将使用映射。
为此,我们将需要两个映射,一个用于存储所有和对及其和,另一个用于存储所有和及其对应对。
因此,Map1→键=对;值→总和
Map2→键=总和整数; 值→向量对
现在,打印所有具有相同总和值的值。
程序来说明上述逻辑-
#include <bits/stdc++.h> using namespace std; void findEqualSumPairs(int A[], int n){ map<int, vector<pair<int, int> > >map1; for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < n; j++) { pair<int, int> p = make_pair(A[i], A[j]); map1[A[i] + A[j]].push_back(p); } } for (auto value = map1.begin(); value != map1.end(); value++) { if (value->second.size() > 1) { for (int i = 0; i < value->second.size(); i++) { cout<<"[ "<<value->second[i].first<<", "<<value->second[i].second<<"] "; } cout<<"have sum : "<<value->first<<endl; } } } int main() { int A[] = { 6, 4, 12, 10, 22,11, 8, 2 }; int n = sizeof(A) / sizeof(A[0]); cout<<"Pairs with same sum are : \n"; findEqualSumPairs(A, n); return 0; }
输出结果
具有相同总和的对是-
[ 6, 4] [ 8, 2] have sum : 10 [ 4, 8] [ 10, 2] have sum : 12 [ 6, 8] [ 4, 10] [ 12, 2] have sum : 14 [ 6, 10] [ 4, 12] have sum : 16 [ 6, 12] [ 10, 8] have sum : 18