📜  C ++程序计算给定总和的对

📅  最后修改于: 2022-05-13 01:55:21.648000             🧑  作者: Mango

C ++程序计算给定总和的对

给定一个整数数组和一个数字“sum”,找出数组中总和等于“sum”的整数对的数量。

例子:

Input  :  arr[] = {1, 5, 7, -1}, 
          sum = 6
Output :  2
Pairs with sum 6 are (1, 5) and (7, -1)

Input  :  arr[] = {1, 5, 7, -1, 5}, 
          sum = 6
Output :  3
Pairs with sum 6 are (1, 5), (7, -1) &
                     (1, 5)         

Input  :  arr[] = {1, 1, 1, 1}, 
          sum = 2
Output :  6
There are 3! pairs with sum 2.

Input  :  arr[] = {10, 12, 10, 15, -1, 7, 6, 
                   5, 4, 2, 1, 1, 1}, 
          sum = 11
Output :  9

预期时间复杂度 O(n)

朴素的解决方案——一个简单的解决方案是遍历每个元素并检查数组中是否有另一个数字可以添加到它以得出总和。

C++
// C++ implementation of simple method to find count of
// pairs with given sum.
#include 
using namespace std;
  
// Returns number of pairs in arr[0..n-1] with sum equal
// to 'sum'
int getPairsCount(int arr[], int n, int sum)
{
    int count = 0; // Initialize result
  
    // Consider all possible pairs and check their sums
    for (int i = 0; i < n; i++)
        for (int j = i + 1; j < n; j++)
            if (arr[i] + arr[j] == sum)
                count++;
  
    return count;
}
  
// Driver function to test the above function
int main()
{
    int arr[] = { 1, 5, 7, -1, 5 };
    int n = sizeof(arr) / sizeof(arr[0]);
    int sum = 6;
    cout << "Count of pairs is "
         << getPairsCount(arr, n, sum);
    return 0;
}


C++
// C++ implementation of simple method to find count of
// pairs with given sum.
#include 
using namespace std;
  
// Returns number of pairs in arr[0..n-1] with sum equal
// to 'sum'
int getPairsCount(int arr[], int n, int sum)
{
    unordered_map m;
  
    // Store counts of all elements in map m
    for (int i = 0; i < n; i++)
        m[arr[i]]++;
  
    int twice_count = 0;
  
    // iterate through each element and increment the
    // count (Notice that every pair is counted twice)
    for (int i = 0; i < n; i++) {
        twice_count += m[sum - arr[i]];
  
        // if (arr[i], arr[i]) pair satisfies the condition,
        // then we need to ensure that the count is
        // decreased by one such that the (arr[i], arr[i])
        // pair is not considered
        if (sum - arr[i] == arr[i])
            twice_count--;
    }
  
    // return the half of twice_count
    return twice_count / 2;
}
  
// Driver function to test the above function
int main()
{
    int arr[] = { 1, 5, 7, -1, 5 };
    int n = sizeof(arr) / sizeof(arr[0]);
    int sum = 6;
    cout << "Count of pairs is "
         << getPairsCount(arr, n, sum);
    return 0;
}


输出
Count of pairs is 3

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

高效的解决方案——
在 O(n) 时间内可能会有更好的解决方案。下面是算法——

  1. 创建一个映射来存储数组中每个数字的频率。 (需要单次遍历)
  2. 在下一次遍历中,对于每个元素,检查它是否可以与任何其他元素(除了它自己!)组合以给出所需的总和。相应地增加计数器。
  3. 在完成第二次遍历后,我们会在 counter 中存储两倍的所需值,因为每一对都被计算了两次。因此将计数除以 2 并返回。

以下是上述想法的实现:

C++

// C++ implementation of simple method to find count of
// pairs with given sum.
#include 
using namespace std;
  
// Returns number of pairs in arr[0..n-1] with sum equal
// to 'sum'
int getPairsCount(int arr[], int n, int sum)
{
    unordered_map m;
  
    // Store counts of all elements in map m
    for (int i = 0; i < n; i++)
        m[arr[i]]++;
  
    int twice_count = 0;
  
    // iterate through each element and increment the
    // count (Notice that every pair is counted twice)
    for (int i = 0; i < n; i++) {
        twice_count += m[sum - arr[i]];
  
        // if (arr[i], arr[i]) pair satisfies the condition,
        // then we need to ensure that the count is
        // decreased by one such that the (arr[i], arr[i])
        // pair is not considered
        if (sum - arr[i] == arr[i])
            twice_count--;
    }
  
    // return the half of twice_count
    return twice_count / 2;
}
  
// Driver function to test the above function
int main()
{
    int arr[] = { 1, 5, 7, -1, 5 };
    int n = sizeof(arr) / sizeof(arr[0]);
    int sum = 6;
    cout << "Count of pairs is "
         << getPairsCount(arr, n, sum);
    return 0;
}
输出
Count of pairs is 3

有关详细信息,请参阅有关给定总和的计数对的完整文章!