📌  相关文章
📜  给定两个未排序的数组,找出总和为 x 的所有对

📅  最后修改于: 2021-10-28 01:26:05             🧑  作者: Mango

给定两个不同元素的未排序数组,任务是从两个数组中找到总和等于X 的所有对。
例子:

Input :  arr1[] = {-1, -2, 4, -6, 5, 7}
         arr2[] = {6, 3, 4, 0}  
         x = 8
Output : 4 4
         5 3

Input : arr1[] = {1, 2, 4, 5, 7} 
        arr2[] = {5, 6, 3, 4, 8}  
        x = 9
Output : 1 8
         4 5
         5 4

询问:亚马逊

一种朴素的方法是简单地运行两个循环并从两个数组中选取元素。一一检查两个元素的总和是否等于给定的值 x。

C++
// C++ program to find all pairs in both arrays
// whose sum is equal to given value x
#include 
 
using namespace std;
 
// Function to print all pairs in both arrays
// whose sum is equal to given value x
void findPairs(int arr1[], int arr2[], int n,
               int m, int x)
{
    for (int i = 0; i < n; i++)
        for (int j = 0; j < m; j++)
            if (arr1[i] + arr2[j] == x)
                cout << arr1[i] << " "
                     << arr2[j] << endl;
}
 
// Driver code
int main()
{
    int arr1[] = { 1, 2, 3, 7, 5, 4 };
    int arr2[] = { 0, 7, 4, 3, 2, 1 };
    int n = sizeof(arr1) / sizeof(int);
    int m = sizeof(arr2) / sizeof(int);
    int x = 8;
    findPairs(arr1, arr2, n, m, x);
    return 0;
}


Java
// Java program to find all pairs in both arrays
// whose sum is equal to given value x
import java.io.*;
 
class GFG {
 
    // Function to print all pairs in both arrays
    // whose sum is equal to given value x
    static void findPairs(int arr1[], int arr2[], int n,
                          int m, int x)
    {
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                if (arr1[i] + arr2[j] == x)
                    System.out.println(arr1[i] + " "
                                       + arr2[j]);
    }
 
    // Driver code
    public static void main(String[] args)
    {
        int arr1[] = { 1, 2, 3, 7, 5, 4 };
        int arr2[] = { 0, 7, 4, 3, 2, 1 };
        int x = 8;
        findPairs(arr1, arr2, arr1.length, arr2.length, x);
    }
}
 
// This code is contributed
// by sunnysingh


Python3
# Python 3 program to find all
# pairs in both arrays whose
# sum is equal to given value x
 
# Function to print all pairs
# in both arrays whose sum is
# equal to given value x
def findPairs(arr1, arr2, n, m, x):
 
    for i in range(0, n):
        for j in range(0, m):
            if (arr1[i] + arr2[j] == x):
                print(arr1[i], arr2[j])
 
# Driver code
arr1 = [1, 2, 3, 7, 5, 4]
arr2 = [0, 7, 4, 3, 2, 1]
n = len(arr1)
m = len(arr2)
x = 8
findPairs(arr1, arr2, n, m, x)
 
# This code is contributed by Smitha Dinesh Semwal


C#
// C# program to find all
// pairs in both arrays
// whose sum is equal to
// given value x
using System;
 
class GFG {
 
    // Function to print all
    // pairs in both arrays
    // whose sum is equal to
    // given value x
    static void findPairs(int[] arr1, int[] arr2,
                          int n, int m, int x)
    {
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                if (arr1[i] + arr2[j] == x)
                    Console.WriteLine(arr1[i] + " " + arr2[j]);
    }
 
    // Driver code
    static void Main()
    {
        int[] arr1 = { 1, 2, 3, 7, 5, 4 };
        int[] arr2 = { 0, 7, 4, 3, 2, 1 };
        int x = 8;
        findPairs(arr1, arr2,
                  arr1.Length,
                  arr2.Length, x);
    }
}
 
// This code is contributed
// by Sam007


PHP


Javascript


C++
#include
using namespace std;
 
void heapify(int a[] , int n , int i)
{
    int rootLargest = i;
    int lchild = 2 * i;
    int rchild = (2 * i) + 1;
 
    if (lchild < n && a[lchild] > a[rootLargest])
        rootLargest = lchild;
 
    if (rchild < n && a[rchild] > a[rootLargest])
        rootLargest = rchild;
 
    if (rootLargest != i)
    {
        swap(a[i] , a[rootLargest]);
 
        //Recursion
        heapify(a , n , rootLargest);
    }
}
 
int binarySearch(int a[] , int l , int r , int x)
{
    while (l <= r)
    {
        int m = l + (r - l) / 2;
 
        if (a[m] == x)
            return m;
 
        if (a[m] < x)
            l = m + 1;
 
        else
            r = m - 1;
    }
    return -1;
}
 
int main()
{
    int A[] = {1,2,1,3,4};
    int B[] = {3,1,5,1,2};
 
    int K = 8;
 
    int n = sizeof(A) / sizeof(A[0]);
 
    // Building the heap
    for (int i = n / 2 - 1 ; i >= 1; i--)
        heapify(A , n , i);
 
    for(int i=0 ; i


Javascript


C++
// C++ program to find all pair in both arrays
// whose sum is equal to given value x
#include 
using namespace std;
 
// Function to find all pairs in both arrays
// whose sum is equal to given value x
void findPairs(int arr1[], int arr2[], int n,
               int m, int x)
{
    // Insert all elements of first array in a hash
    unordered_set s;
    for (int i = 0; i < n; i++)
        s.insert(arr1[i]);
 
    // Subtract sum from second array elements one
    // by one and check it's present in array first
    // or not
    for (int j = 0; j < m; j++)
        if (s.find(x - arr2[j]) != s.end())
            cout << x - arr2[j] << " "
                 << arr2[j] << endl;
}
 
// Driver code
int main()
{
    int arr1[] = { 1, 0, -4, 7, 6, 4 };
    int arr2[] = { 0, 2, 4, -3, 2, 1 };
    int x = 8;
    int n = sizeof(arr1) / sizeof(int);
    int m = sizeof(arr2) / sizeof(int);
    findPairs(arr1, arr2, n, m, x);
    return 0;
}


Java
// JAVA Code for Given two unsorted arrays,
// find all pairs whose sum is x
import java.util.*;
 
class GFG {
 
    // Function to find all pairs in both arrays
    // whose sum is equal to given value x
    public static void findPairs(int arr1[], int arr2[],
                                 int n, int m, int x)
    {
        // Insert all elements of first array in a hash
        HashMap s = new HashMap();
 
        for (int i = 0; i < n; i++)
            s.put(arr1[i], 0);
 
        // Subtract sum from second array elements one
        // by one and check it's present in array first
        // or not
        for (int j = 0; j < m; j++)
            if (s.containsKey(x - arr2[j]))
                System.out.println(x - arr2[j] + " " + arr2[j]);
    }
 
    /* Driver program to test above function */
    public static void main(String[] args)
    {
        int arr1[] = { 1, 0, -4, 7, 6, 4 };
        int arr2[] = { 0, 2, 4, -3, 2, 1 };
        int x = 8;
 
        findPairs(arr1, arr2, arr1.length, arr2.length, x);
    }
}
// This code is contributed by Arnav Kr. Mandal.


Python3
# Python3 program to find all
# pair in both arrays whose
# sum is equal to given value x
 
# Function to find all pairs
# in both arrays whose sum is
# equal to given value x
def findPairs(arr1, arr2, n, m, x):
 
    # Insert all elements of
    # first array in a hash
    s = set()
    for i in range (0, n):
        s.add(arr1[i])
 
    # Subtract sum from second
    # array elements one by one
    # and check it's present in
    # array first or not
    for j in range(0, m):
        if ((x - arr2[j]) in s):
            print((x - arr2[j]), '', arr2[j])
 
# Driver code
arr1 = [1, 0, -4, 7, 6, 4]
arr2 = [0, 2, 4, -3, 2, 1]
x = 8
 
n = len(arr1)
m = len(arr2)
findPairs(arr1, arr2, n, m, x)
 
# This code is contributed
# by ihritik


C#
// C# Code for Given two unsorted arrays,
// find all pairs whose sum is x
using System;
using System.Collections.Generic;
 
class GFG {
 
    // Function to find all pairs in
    // both arrays whose sum is equal
    // to given value x
    public static void findPairs(int[] arr1, int[] arr2,
                                 int n, int m, int x)
    {
        // Insert all elements of first
        // array in a hash
        Dictionary
            s = new Dictionary();
 
        for (int i = 0; i < n; i++) {
            s[arr1[i]] = 0;
        }
 
        // Subtract sum from second array
        // elements one by one and check
        // it's present in array first
        // or not
        for (int j = 0; j < m; j++) {
            if (s.ContainsKey(x - arr2[j])) {
                Console.WriteLine(x - arr2[j] + " " + arr2[j]);
            }
        }
    }
 
    // Driver Code
    public static void Main(string[] args)
    {
        int[] arr1 = new int[] { 1, 0, -4, 7, 6, 4 };
        int[] arr2 = new int[] { 0, 2, 4, -3, 2, 1 };
        int x = 8;
 
        findPairs(arr1, arr2, arr1.Length,
                  arr2.Length, x);
    }
}
 
// This code is contributed by Shrikant13


Javascript


输出:

1 7
7 1
5 3
4 4

时间复杂度: O(n^2)
辅助空间: O(1)

搜索方法:众所周知,排序算法可以在 O (n log n) 时间内对数据进行排序。因此,我们将选择 O (n log n) 时间算法,例如:快速排序或堆排序。对于第二个数组的每个元素,我们将从 K 中减去它并在第一个数组中搜索它。

脚步:

  1. 首先使用 O(n log n) 算法(如堆排序或快速排序)对给定数组进行排序。
  2. 为数组 B 的每个元素(0 到 n)运行一个循环。
  3. 在循环内部,使用临时变量 temp,并且 temp = K – B[i]。
  4. 使用二进制搜索(log n) 在第一个数组即A 中搜索临时变量。

如果在 A 中找到元素,则存在 a ∈ A 和 b ∈ B,使得 a + b = K。

代码:

C++

#include
using namespace std;
 
void heapify(int a[] , int n , int i)
{
    int rootLargest = i;
    int lchild = 2 * i;
    int rchild = (2 * i) + 1;
 
    if (lchild < n && a[lchild] > a[rootLargest])
        rootLargest = lchild;
 
    if (rchild < n && a[rchild] > a[rootLargest])
        rootLargest = rchild;
 
    if (rootLargest != i)
    {
        swap(a[i] , a[rootLargest]);
 
        //Recursion
        heapify(a , n , rootLargest);
    }
}
 
int binarySearch(int a[] , int l , int r , int x)
{
    while (l <= r)
    {
        int m = l + (r - l) / 2;
 
        if (a[m] == x)
            return m;
 
        if (a[m] < x)
            l = m + 1;
 
        else
            r = m - 1;
    }
    return -1;
}
 
int main()
{
    int A[] = {1,2,1,3,4};
    int B[] = {3,1,5,1,2};
 
    int K = 8;
 
    int n = sizeof(A) / sizeof(A[0]);
 
    // Building the heap
    for (int i = n / 2 - 1 ; i >= 1; i--)
        heapify(A , n , i);
 
    for(int i=0 ; i

Javascript


输出:

Found the elements

时间复杂度:O(n logn)。

O(log n + n log n)

因此,总体时间复杂度 = O(n logn)。

这个问题的一个有效解决方案是散列。哈希表是在 C++ 中使用 unordered_set 实现的。

  • 我们将所有第一个数组元素存储在哈希表中。
  • 对于第二个数组的元素,我们从 x 中减去每个元素并检查哈希表中的结果。
  • 如果结果存在,我们打印哈希中的元素和键(它是第一个数组的元素)。

C++

// C++ program to find all pair in both arrays
// whose sum is equal to given value x
#include 
using namespace std;
 
// Function to find all pairs in both arrays
// whose sum is equal to given value x
void findPairs(int arr1[], int arr2[], int n,
               int m, int x)
{
    // Insert all elements of first array in a hash
    unordered_set s;
    for (int i = 0; i < n; i++)
        s.insert(arr1[i]);
 
    // Subtract sum from second array elements one
    // by one and check it's present in array first
    // or not
    for (int j = 0; j < m; j++)
        if (s.find(x - arr2[j]) != s.end())
            cout << x - arr2[j] << " "
                 << arr2[j] << endl;
}
 
// Driver code
int main()
{
    int arr1[] = { 1, 0, -4, 7, 6, 4 };
    int arr2[] = { 0, 2, 4, -3, 2, 1 };
    int x = 8;
    int n = sizeof(arr1) / sizeof(int);
    int m = sizeof(arr2) / sizeof(int);
    findPairs(arr1, arr2, n, m, x);
    return 0;
}

Java

// JAVA Code for Given two unsorted arrays,
// find all pairs whose sum is x
import java.util.*;
 
class GFG {
 
    // Function to find all pairs in both arrays
    // whose sum is equal to given value x
    public static void findPairs(int arr1[], int arr2[],
                                 int n, int m, int x)
    {
        // Insert all elements of first array in a hash
        HashMap s = new HashMap();
 
        for (int i = 0; i < n; i++)
            s.put(arr1[i], 0);
 
        // Subtract sum from second array elements one
        // by one and check it's present in array first
        // or not
        for (int j = 0; j < m; j++)
            if (s.containsKey(x - arr2[j]))
                System.out.println(x - arr2[j] + " " + arr2[j]);
    }
 
    /* Driver program to test above function */
    public static void main(String[] args)
    {
        int arr1[] = { 1, 0, -4, 7, 6, 4 };
        int arr2[] = { 0, 2, 4, -3, 2, 1 };
        int x = 8;
 
        findPairs(arr1, arr2, arr1.length, arr2.length, x);
    }
}
// This code is contributed by Arnav Kr. Mandal.

蟒蛇3

# Python3 program to find all
# pair in both arrays whose
# sum is equal to given value x
 
# Function to find all pairs
# in both arrays whose sum is
# equal to given value x
def findPairs(arr1, arr2, n, m, x):
 
    # Insert all elements of
    # first array in a hash
    s = set()
    for i in range (0, n):
        s.add(arr1[i])
 
    # Subtract sum from second
    # array elements one by one
    # and check it's present in
    # array first or not
    for j in range(0, m):
        if ((x - arr2[j]) in s):
            print((x - arr2[j]), '', arr2[j])
 
# Driver code
arr1 = [1, 0, -4, 7, 6, 4]
arr2 = [0, 2, 4, -3, 2, 1]
x = 8
 
n = len(arr1)
m = len(arr2)
findPairs(arr1, arr2, n, m, x)
 
# This code is contributed
# by ihritik

C#

// C# Code for Given two unsorted arrays,
// find all pairs whose sum is x
using System;
using System.Collections.Generic;
 
class GFG {
 
    // Function to find all pairs in
    // both arrays whose sum is equal
    // to given value x
    public static void findPairs(int[] arr1, int[] arr2,
                                 int n, int m, int x)
    {
        // Insert all elements of first
        // array in a hash
        Dictionary
            s = new Dictionary();
 
        for (int i = 0; i < n; i++) {
            s[arr1[i]] = 0;
        }
 
        // Subtract sum from second array
        // elements one by one and check
        // it's present in array first
        // or not
        for (int j = 0; j < m; j++) {
            if (s.ContainsKey(x - arr2[j])) {
                Console.WriteLine(x - arr2[j] + " " + arr2[j]);
            }
        }
    }
 
    // Driver Code
    public static void Main(string[] args)
    {
        int[] arr1 = new int[] { 1, 0, -4, 7, 6, 4 };
        int[] arr2 = new int[] { 0, 2, 4, -3, 2, 1 };
        int x = 8;
 
        findPairs(arr1, arr2, arr1.Length,
                  arr2.Length, x);
    }
}
 
// This code is contributed by Shrikant13

Javascript


输出:

6 2
4 4
6 2
7 1

时间复杂度: O(max(n, m))
辅助空间: O(n)

如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程学生竞争性编程现场课程