📌  相关文章
📜  计数两个总和等于K的数组中的对

📅  最后修改于: 2021-05-06 23:35:41             🧑  作者: Mango

给定一个整数K以及两个数组A1A2 ,任务是返回对总数为K的对总数( A1中的一个元素和A2中的一个元素)。
注意:数组可以具有重复的元素。我们认为每一对都是不同的,唯一的约束是,(任何数组中的)一个元素只能参与一对。例如,A1 [] = {3,3},A2 [] = {4,4}和K = 7,我们只考虑两对(3,4)和(3,4)
例子:

方法:

  • 创建数组A1的元素的映射。
  • 对于数组A2中的每个元素,检查在上一步创建的映射中是否存在temp = K – A2 [i]
  • 如果map [temp]> 0,则将结果加1,并将map [temp]1
  • 最后打印总数。

下面是上述方法的实现:

C++
// C++ implementation of above approach.
 
#include 
using namespace std;
 
// Function to return the count of pairs
// having sum equal to K
int countPairs(int A1[], int A2[]
                  , int n1, int n2, int K)
{
    // Initialize pairs to 0
    int res = 0;
 
    // create map of elements of array A1
    unordered_map m;
    for (int i = 0; i < n1; ++i)
        m[A1[i]]++;
 
    // count total pairs
    for (int i = 0; i < n2; ++i) {
        int temp = K - A2[i];
 
        if (m[temp] != 0) {
            res++;
 
            // Every element can be part
            // of at most one pair.
            m[temp]--;
        }
    }
 
    // return total pairs
    return res;
}
 
// Driver program
int main()
{
    int A1[] = { 1, 1, 3, 4, 5, 6, 6 };
    int A2[] = { 1, 4, 4, 5, 7 }, K = 10;
 
    int n1 = sizeof(A1) / sizeof(A1[0]);
    int n2 = sizeof(A2) / sizeof(A2[0]);
 
    // function call to print required answer
    cout << countPairs(A1, A2, n1, n2, K);
 
    return 0;
}


Java
// Java implementation of above approach.
import java.util.*;
class GfG {
 
// Function to return the count of pairs
// having sum equal to K
static int countPairs(int A1[], int A2[] , int n1, int n2, int K)
{
    // Initialize pairs to 0
    int res = 0;
 
    // create map of elements of array A1
    Map m = new HashMap ();
    for (int i = 0; i < n1; ++i)
    {
        if(m.containsKey(A1[i]))
        m.put(A1[i], m.get(A1[i]) + 1);
        else
        m.put(A1[i], 1);
    }
 
    // count total pairs
    for (int i = 0; i < n2; ++i) {
        int temp = K - A2[i];
 
        if (m.containsKey(temp) && m.get(temp) != 0) {
            res++;
 
            // Every element can be part
            // of at most one pair.
            m.put(temp, m.get(A1[i]) - 1);
        }
    }
 
    // return total pairs
    return res;
}
 
// Driver program
public static void main(String[] args)
{
    int A1[] = { 1, 1, 3, 4, 5, 6, 6 };
    int A2[] = { 1, 4, 4, 5, 7 }, K = 10;
 
    int n1 = A1.length;
    int n2 = A2.length;
 
    // function call to print required answer
    System.out.println(countPairs(A1, A2, n1, n2, K));
}
}


Python3
# Python3 implementation of above approach
 
# Function to return the count of
# pairs having sum equal to K
def countPairs(A1, A2, n1, n2, K):
     
    # Initialize pairs to 0
    res = 0
     
    # Create dictionary of elements
    # of array A1
    m = dict()
    for i in range(0, n1):
        if A1[i] not in m.keys():
            m[A1[i]] = 1
        else:
            m[A1[i]] = m[A1[i]] + 1
         
    # count total pairs
    for i in range(0, n2):
        temp = K - A2[i]
        if temp in m.keys():
            res = res + 1
             
            # Every element can be part
            # of at most one pair
            m[temp] = m[temp] - 1
     
    # return total pairs
    return res
 
# Driver Code
A1 = [1, 1, 3, 4, 5, 6 ,6]
A2 = [1, 4, 4, 5, 7]
K = 10
 
n1 = len(A1)
n2 = len(A2)
 
# function call to print required answer
print(countPairs(A1, A2, n1, n2, K))
         
# This code is contributed
# by Shashank_Sharma


C#
// C# implementation of above approach.
using System;
using System.Collections.Generic;
 
class GfG
{
 
// Function to return the count of pairs
// having sum equal to K
static int countPairs(int []A1, int []A2 ,
                        int n1, int n2, int K)
{
    // Initialize pairs to 0
    int res = 0;
 
    // create map of elements of array A1
    Dictionary m = new Dictionary ();
    for (int i = 0; i < n1; ++i)
    {
        int a;
        if(m.ContainsKey(A1[i]))
        {
            a = m[A1[i]] + 1;
            m.Remove(A1[i]);
            m.Add(A1[i], a);
        }
        else
        m.Add(A1[i], 1);
    }
 
    // count total pairs
    for (int i = 0; i < n2; ++i)
    {
        int temp = K - A2[i];
 
        if (m.ContainsKey(temp) && m[temp] != 0)
        {
            res++;
 
            // Every element can be part
            // of at most one pair.
            m.Remove(temp);
            m.Add(temp, m[A1[i]] - 1);
        }
    }
 
    // return total pairs
    return res;
}
 
// Driver program
public static void Main()
{
    int []A1 = { 1, 1, 3, 4, 5, 6, 6 };
    int []A2 = { 1, 4, 4, 5, 7 };
    int K = 10;
 
    int n1 = A1.Length;
    int n2 = A2.Length;
 
    // function call to print required answer
    Console.WriteLine(countPairs(A1, A2, n1, n2, K));
}
}
 
/* This code contributed by PrinciRaj1992 */


输出:
4

时间复杂度: O(N + M)

辅助空间: O(N + M)