Count pairs with given sum | Set 2

Given an array arr[] and an integer sum, the task is to find the number of pairs of integers in the array whose sum is equal to sum.

Examples:

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

Approach: Two Different methods have already been discussed here. Here, a method based on sorting will be discussed.

  1. Sort the array and take two pointers i and j, one pointer pointing to the start of the array i.e. i = 0 and another pointer pointing to the end of the array i.e. j = n – 1.
    • If arr[i] + arr[j] is

    • Greater than the sum then decrement j.
    • Lesser than the sum then increment i.
    • Equals to the sum then count such pairs.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to return the count of pairs
// from arr[] with the given sum
int pairs_count(int arr[], int n, int sum)
{
    // To store the count of pairs
    int ans = 0;
  
    // Sort the given array
    sort(arr, arr + n);
  
    // Take two pointers
    int i = 0, j = n - 1;
  
    while (i < j) {
        // If sum is greater
        if (arr[i] + arr[j] < sum)
            i++;
  
        // If sum is lesser
        else if (arr[i] + arr[j] > sum)
            j--;
  
        // If sum is equal
        else {
            // Find the frequency of arr[i]
            int x = arr[i], xx = i;
            while (i < j and arr[i] == x)
                i++;
  
            // Find the frequency of arr[j]
            int y = arr[j], yy = j;
            while (j >= i and arr[j] == y)
                j--;
  
            // If arr[i] and arr[j] are same
            // then remove the extra number counted
            if (x == y) {
                int temp = i - xx + yy - j - 1;
                ans += (temp * (temp + 1)) / 2;
            }
            else
                ans += (i - xx) * (yy - j);
        }
    }
  
    // Return the required answer
    return ans;
}
  
// Driver code
int main()
{
    int arr[] = { 1, 5, 7, 5, -1 };
    int n = sizeof(arr) / sizeof(arr[0]);
    int sum = 6;
  
    cout << pairs_count(arr, n, sum);
  
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

//Java implementation of the approach
import java.util.Arrays; 
import java.io.*;
  
class GFG 
{
      
// Function to return the count of pairs
// from arr[] with the given sum
static int pairs_count(int arr[], int n, int sum)
{
    // To store the count of pairs
    int ans = 0;
  
    // Sort the given array
    Arrays.sort(arr);
  
    // Take two pointers
    int i = 0, j = n - 1;
  
    while (i < j)
    {
          
        // If sum is greater
        if (arr[i] + arr[j] < sum)
            i++;
  
        // If sum is lesser
        else if (arr[i] + arr[j] > sum)
            j--;
  
        // If sum is equal
        else 
        {
              
            // Find the frequency of arr[i]
            int x = arr[i], xx = i;
            while ((i < j ) && (arr[i] == x))
                i++;
  
            // Find the frequency of arr[j]
            int y = arr[j], yy = j;
            while ((j >= i )&& (arr[j] == y))
                j--;
  
            // If arr[i] and arr[j] are same
            // then remove the extra number counted
            if (x == y) 
            {
                int temp = i - xx + yy - j - 1;
                ans += (temp * (temp + 1)) / 2;
            }
            else
                ans += (i - xx) * (yy - j);
        }
    }
  
    // Return the required answer
    return ans;
}
  
// Driver code
public static void main (String[] args) 
{
    int arr[] = { 1, 5, 7, 5, -1 };
    int n = arr.length;
    int sum = 6;
      
    System.out.println (pairs_count(arr, n, sum));
}
}
  
// The code is contributed by ajit.. 

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 implementation of the approach
  
# Function to return the count of pairs
# from arr with the given sum
def pairs_count(arr, n, sum):
      
    # To store the count of pairs
    ans = 0
  
    # Sort the given array
    arr = sorted(arr)
  
    # Take two pointers
    i, j = 0, n - 1
  
    while (i < j):
          
        # If sum is greater
        if (arr[i] + arr[j] < sum):
            i += 1
  
        # If sum is lesser
        elif (arr[i] + arr[j] > sum):
            j -= 1
              
        # If sum is equal
        else:
              
            # Find the frequency of arr[i]
            x = arr[i]
            xx = i
            while (i < j and arr[i] == x):
                i += 1
  
            # Find the frequency of arr[j]
            y = arr[j]
            yy = j
            while (j >= i and arr[j] == y):
                j -= 1
  
            # If arr[i] and arr[j] are same
            # then remove the extra number counted
            if (x == y):
                temp = i - xx + yy - j - 1
                ans += (temp * (temp + 1)) // 2
            else:
                ans += (i - xx) * (yy - j)
  
    # Return the required answer
    return ans
  
# Driver code
arr = [1, 5, 7, 5, -1]
n = len(arr)
sum = 6
  
print(pairs_count(arr, n, sum))
  
# This code is contributed by Mohit Kumar

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# implementation of the approach 
using System;
      
class GFG 
{
      
// Function to return the count of pairs
// from arr[] with the given sum
static int pairs_count(int []arr, 
                       int n, int sum)
{
    // To store the count of pairs
    int ans = 0;
  
    // Sort the given array
    Array.Sort(arr);
  
    // Take two pointers
    int i = 0, j = n - 1;
  
    while (i < j)
    {
          
        // If sum is greater
        if (arr[i] + arr[j] < sum)
            i++;
  
        // If sum is lesser
        else if (arr[i] + arr[j] > sum)
            j--;
  
        // If sum is equal
        else
        {
              
            // Find the frequency of arr[i]
            int x = arr[i], xx = i;
            while ((i < j) && (arr[i] == x))
                i++;
  
            // Find the frequency of arr[j]
            int y = arr[j], yy = j;
            while ((j >= i) && (arr[j] == y))
                j--;
  
            // If arr[i] and arr[j] are same
            // then remove the extra number counted
            if (x == y) 
            {
                int temp = i - xx + yy - j - 1;
                ans += (temp * (temp + 1)) / 2;
            }
            else
                ans += (i - xx) * (yy - j);
        }
    }
  
    // Return the required answer
    return ans;
}
  
// Driver code
public static void Main (String[] args) 
{
    int []arr = { 1, 5, 7, 5, -1 };
    int n = arr.Length;
    int sum = 6;
      
    Console.WriteLine (pairs_count(arr, n, sum));
}
}
  
// This code is contributed by PrinciRaj1992 

chevron_right


Output:

3


My Personal Notes arrow_drop_up

pawanasipugmailcom

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.