给定一个未排序的数组 A[]。任务是用相等的和打印未排序数组中的所有唯一对。
注意:按照以下示例所示的格式打印结果。
例子:
Input: A[] = { 6, 4, 12, 10, 22, 54, 32, 42, 21, 11}
Output:
Pairs : ( 4, 12) ( 6, 10) have sum : 16
Pairs : ( 10, 22) ( 21, 11) have sum : 32
Pairs : ( 12, 21) ( 22, 11) have sum : 33
Pairs : ( 22, 21) ( 32, 11) have sum : 43
Pairs : ( 32, 21) ( 42, 11) have sum : 53
Pairs : ( 12, 42) ( 22, 32) have sum : 54
Pairs : ( 10, 54) ( 22, 42) have sum : 64
Input:A[]= { 4, 23, 65, 67, 24, 12, 86}
Output:
Pairs : ( 4, 86) ( 23, 67) have sum : 90
这个想法是在 C++ STL 中使用 map 来避免重复的元素对。
- 创建一个键为整数对、值为整数的映射,以存储所有唯一的元素对及其相应的总和。
- 遍历数组并生成所有可能的对并将这些对及其对应的总和存储在第一个映射上。
- 创建第二个映射,将键作为整数,值作为对的向量,以存储具有相应总和的所有元素对的列表。
- 最后,遍历第二张地图,对于超过一对的和,打印所有对,然后按照上面示例所示的格式打印相应的和。
下面是上述方法的实现:
C++
// C++ program to print all pairs
// with equal sum
#include
using namespace std;
// Function to print all pairs
// with equal sum
void pairWithEqualSum(int A[], int n)
{
map > > mp;
// Insert all unique pairs and their
// corresponding sum in the map
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
pair p = make_pair(A[i], A[j]);
mp[A[i] + A[j]].push_back(p);
}
}
// Traverse the map mp, and for sum
// with more than one pair, print all pairs
// and the corresponding sum
for (auto itr = mp.begin(); itr != mp.end(); itr++) {
if (itr->second.size() > 1) {
cout << "Pairs : ";
for (int i = 0; i < itr->second.size(); i++) {
cout << "( " << itr->second[i].first << ", "
<< itr->second[i].second << ") ";
}
cout << " have sum : " << itr->first << endl;
}
}
}
// Driver Code
int main()
{
int A[]
= { 6, 4, 12, 10, 22, 54, 32, 42, 21, 11, 8, 2 };
int n = sizeof(A) / sizeof(A[0]);
pairWithEqualSum(A, n);
return 0;
}
Java
// Java program to print all pairs
// with equal sum
import java.util.*;
class GFG {
static class pair {
int first, second;
public pair(int first, int second)
{
this.first = first;
this.second = second;
}
}
// Function to print all pairs
// with equal sum
static void pairWithEqualSum(int A[], int n)
{
Map > mp = new HashMap<>();
// Insert all unique pairs and their
// corresponding sum in the map
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
pair p = new pair(A[i], A[j]);
Vector pp = new Vector();
if (mp.containsKey(A[i] + A[j]))
pp.addAll(mp.get(A[i] + A[j]));
pp.add(p);
mp.put(A[i] + A[j], pp);
}
}
// Traverse the map mp, and for sum
// with more than one pair, print all pairs
// and the corresponding sum
for (Map.Entry > itr :
mp.entrySet()) {
if (itr.getValue().size() > 1) {
System.out.print("Pairs : ");
for (int i = 0; i < itr.getValue().size();
i++) {
System.out.print(
"( " + itr.getValue().get(i).first
+ ", "
+ itr.getValue().get(i).second
+ ") ");
}
System.out.print(
" have sum : " + itr.getKey() + "\n");
}
}
}
// Driver Code
public static void main(String[] args)
{
int A[] = { 6, 4, 12, 10, 22, 54,
32, 42, 21, 11, 8, 2 };
int n = A.length;
pairWithEqualSum(A, n);
}
}
// This code is contributed by Rajput-Ji
Python3
# Python implementation of the
# approach
# Function to print all pairs
# with equal sum
def pairWithEqualSum(A, n):
mp = {}
# Insert all unique pairs and their
# corresponding sum in the map
for i in range(n):
for j in range(i+1, n):
if A[i]+A[j] in mp:
mp[A[i]+A[j]].append((A[i], A[j]))
else:
mp[A[i]+A[j]] = [(A[i], A[j])]
# Traverse the map mp, and for sum
# with more than one pair, print all pairs
# and the corresponding sum
for itr in mp:
if len(mp[itr]) > 1:
print("Pairs : ", end="")
for i in range(0, len(mp[itr])):
print("(", mp[itr][i][0], ",",
mp[itr][i][1], ")", end=" ")
print("have sum :", itr)
# Driver Code
if __name__ == "__main__":
A = [6, 4, 12, 10, 22, 54,
32, 42, 21, 11, 8, 2]
n = len(A)
pairWithEqualSum(A, n)
C#
// C# program to print all pairs
// with equal sum
using System;
using System.Collections.Generic;
class GFG {
class pair {
public int first, second;
public pair(int first, int second)
{
this.first = first;
this.second = second;
}
}
// Function to print all pairs
// with equal sum
static void pairWithEqualSum(int[] A, int n)
{
Dictionary > mp
= new Dictionary >();
// Insert all unique pairs and their
// corresponding sum in the map
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
pair p = new pair(A[i], A[j]);
List pp = new List();
if (mp.ContainsKey(A[i] + A[j]))
pp = AddAll(mp[A[i] + A[j]]);
pp.Add(p);
if (mp.ContainsKey(A[i] + A[j]))
mp[A[i] + A[j]] = pp;
else
mp.Add(A[i] + A[j], pp);
}
}
// Traverse the map mp, and for sum
// with more than one pair, print all pairs
// and the corresponding sum
foreach(KeyValuePair > itr in mp)
{
if (itr.Value.Count > 1) {
Console.Write("Pairs : ");
for (int i = 0; i < itr.Value.Count; i++) {
Console.Write(
"( " + itr.Value[i].first + ", "
+ itr.Value[i].second + ") ");
}
Console.Write(" have sum : " + itr.Key
+ "\n");
}
}
}
static List AddAll(List list)
{
List l = new List();
foreach(pair p in list) l.Add(p);
return l;
}
// Driver Code
public static void Main(String[] args)
{
int[] A = { 6, 4, 12, 10, 22, 54,
32, 42, 21, 11, 8, 2 };
int n = A.Length;
pairWithEqualSum(A, n);
}
}
// This code is contributed by Rajput-Ji
Java
// Java program for the above approach
import java.io.*;
import java.util.HashMap;
import java.util.Map;
class GFG{
// Function to find pairs
public void findPairs(int arr[]){
Map map = new HashMap();
int sum = 0, element = 0;
// Iterate from 0 to arr.length
for(int i = 0; i < arr.length; i++)
{
// Iterate from i+1 to arr.length
for(int j = i + 1; j < arr.length; j++)
{
sum = arr[i] + arr[j];
// If sum is found in map
if(map.get(sum) != null)
{
// To find the first array
// element whose of the sum pair
element = map.get(sum);
// Print the output
System.out.println("Pairs:(" + arr[i] +
"," + arr[j] + ") (" +
element + "," +
(sum - element) +
") have sum:" + sum);
}
else
{
// Else put map[sum] = arr[i]
map.put(sum, arr[i]);
}
}
}
}
// Driver Code
public static void main(String[] args)
{
int arr[] = {6, 4, 12, 10, 22, 54,
32, 42, 21, 11, 8, 2};
GFG obj = new GFG();
// Function Call
obj.findPairs(arr);
}
}
输出
Pairs : ( 6, 4) ( 8, 2) have sum : 10
Pairs : ( 4, 8) ( 10, 2) have sum : 12
Pairs : ( 6, 8) ( 4, 10) ( 12, 2) have sum : 14
Pairs : ( 6, 10) ( 4, 12) have sum : 16
Pairs : ( 6, 12) ( 10, 8) have sum : 18
Pairs : ( 12, 11) ( 21, 2) have sum : 23
Pairs : ( 10, 22) ( 21, 11) have sum : 32
Pairs : ( 12, 21) ( 22, 11) have sum : 33
Pairs : ( 12, 22) ( 32, 2) have sum : 34
Pairs : ( 22, 21) ( 32, 11) have sum : 43
Pairs : ( 12, 32) ( 42, 2) have sum : 44
Pairs : ( 32, 21) ( 42, 11) have sum : 53
Pairs : ( 12, 42) ( 22, 32) have sum : 54
Pairs : ( 10, 54) ( 22, 42) have sum : 64
使用单个地图的上述相同方法的另一种实现。
Java
// Java program for the above approach
import java.io.*;
import java.util.HashMap;
import java.util.Map;
class GFG{
// Function to find pairs
public void findPairs(int arr[]){
Map map = new HashMap();
int sum = 0, element = 0;
// Iterate from 0 to arr.length
for(int i = 0; i < arr.length; i++)
{
// Iterate from i+1 to arr.length
for(int j = i + 1; j < arr.length; j++)
{
sum = arr[i] + arr[j];
// If sum is found in map
if(map.get(sum) != null)
{
// To find the first array
// element whose of the sum pair
element = map.get(sum);
// Print the output
System.out.println("Pairs:(" + arr[i] +
"," + arr[j] + ") (" +
element + "," +
(sum - element) +
") have sum:" + sum);
}
else
{
// Else put map[sum] = arr[i]
map.put(sum, arr[i]);
}
}
}
}
// Driver Code
public static void main(String[] args)
{
int arr[] = {6, 4, 12, 10, 22, 54,
32, 42, 21, 11, 8, 2};
GFG obj = new GFG();
// Function Call
obj.findPairs(arr);
}
}
输出
Pairs:(4,12) (6,10) have sum:16
Pairs:(4,10) (6,8) have sum:14
Pairs:(12,2) (6,8) have sum:14
Pairs:(10,8) (6,12) have sum:18
Pairs:(10,2) (4,8) have sum:12
Pairs:(22,32) (12,42) have sum:54
Pairs:(22,42) (10,54) have sum:64
Pairs:(22,11) (12,21) have sum:33
Pairs:(32,11) (22,21) have sum:43
Pairs:(32,2) (12,22) have sum:34
Pairs:(42,11) (32,21) have sum:53
Pairs:(42,2) (12,32) have sum:44
Pairs:(21,11) (10,22) have sum:32
Pairs:(21,2) (12,11) have sum:23
Pairs:(8,2) (6,4) have sum:10
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。