Open In App

Count the pairs in an array such that the difference between them and their indices is equal

Last Updated : 19 Mar, 2022
Improve
Improve
Like Article
Like
Save
Share
Report

Given an array arr[] of size N, the task is to count the number of pairs (arr[i], arr[j]) such that arr[j] – arr[i] = j – i.
Examples: 
 

Input: arr[] = {5, 2, 7} 
Output:
The only valid pair is (arr[0], arr[2]) as 7 – 5 = 2 – 0 = 2.
Input: arr[] = {1, 2, 3, 4} 
Output:
 

Approach: A pair (arr[i], arr[j]) is said to be valid if (arr[j] – arr[i]) = (j – i), it can also be written as (arr[j] – j) = (arr[i] – i) which is the difference of the element with its index. Now, the task is to divide the array into groups such that every group has equal difference of the element with its index then for every group if it has N elements, the count of possible pairs will be (N * (N – 1)) / 2.
Below is the implementation of the above approach: 
 

C++




// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to return the count
// of all valid pairs
int countPairs(int arr[], int n)
{
 
    // To store the frequencies
    // of (arr[i] - i)
    unordered_map<int, int> map;
    for (int i = 0; i < n; i++)
        map[arr[i] - i]++;
 
    // To store the required count
    int res = 0;
    for (auto x : map) {
        int cnt = x.second;
 
        // If cnt is the number of elements
        // whose difference with their index
        // is same then ((cnt * (cnt - 1)) / 2)
        // such pairs are possible
        res += ((cnt * (cnt - 1)) / 2);
    }
 
    return res;
}
 
// Driver code
int main()
{
    int arr[] = { 1, 5, 6, 7, 9 };
    int n = sizeof(arr) / sizeof(arr[0]);
 
    cout << countPairs(arr, n);
 
    return 0;
}


Java




// Java implementation of the approach
import java.util.HashMap;
 
class GFG
{
     
    // Function to return the count
    // of all valid pairs
    static int countPairs(int arr[], int n)
    {
     
        // To store the frequencies
        // of (arr[i] - i)
        HashMap<Integer,
                Integer> map = new HashMap<Integer,
                                           Integer>();
        for (int i = 0; i < n; i++)
            map.put(arr[i] - i, 0);
         
        for (int i = 0; i < n; i++)
            map.put(arr[i] - i, map.get(arr[i] - i) + 1);
     
        // To store the required count
        int res = 0;
        for (int x : map.values())
        {
            int cnt = x;
     
            // If cnt is the number of elements
            // whose difference with their index
            // is same then ((cnt * (cnt - 1)) / 2)
            // such pairs are possible
            res += ((cnt * (cnt - 1)) / 2);
        }
     
        return res;
    }
     
    // Driver code
    public static void main (String[] args)
    {
        int arr[] = { 1, 5, 6, 7, 9 };
        int n = arr.length;
     
        System.out.println(countPairs(arr, n));
    }
}
 
// This code is contributed by AnkitRai01


Python3




# Python3 implementation of the approach
 
# Function to return the count
# of all valid pairs
def countPairs(arr, n):
 
    # To store the frequencies
    # of (arr[i] - i)
    map = dict()
    for i in range(n):
        map[arr[i] - i] = map.get(arr[i] - i, 0) + 1
 
    # To store the required count
    res = 0
    for x in map:
        cnt = map[x]
 
        # If cnt is the number of elements
        # whose difference with their index
        # is same then ((cnt * (cnt - 1)) / 2)
        # such pairs are possible
        res += ((cnt * (cnt - 1)) // 2)
 
    return res
 
# Driver code
arr = [1, 5, 6, 7, 9]
n = len(arr)
 
print(countPairs(arr, n))
 
# This code is contributed by Mohit Kumar


C#




// C# implementation of the approach
using System;
using System.Collections.Generic;
class GFG
{
     
    // Function to return the count
    // of all valid pairs
    static int countPairs(int []arr, int n)
    {
     
        // To store the frequencies
        // of (arr[i] - i)
        Dictionary<int,
                   int> map = new Dictionary<int,
                                             int>();
        for (int i = 0; i < n; i++)
            map[arr[i] - i] = 0;
         
        for (int i = 0; i < n; i++)
            map[arr[i] - i]++;
     
        // To store the required count
        int res = 0;
        foreach(KeyValuePair<int, int> x in map)
        {
            int cnt = x.Value;
     
            // If cnt is the number of elements
            // whose difference with their index
            // is same then ((cnt * (cnt - 1)) / 2)
            // such pairs are possible
            res += ((cnt * (cnt - 1)) / 2);
        }
        return res;
    }
     
    // Driver code
    public static void Main (String []args)
    {
        int []arr = { 1, 5, 6, 7, 9 };
        int n = arr.Length;
     
        Console.WriteLine(countPairs(arr, n));
    }
}
 
// This code is contributed by Arnab Kundu


Javascript




<script>
      // JavaScript implementation of the approach
      // Function to return the count
      // of all valid pairs
      function countPairs(arr, n) {
        // To store the frequencies
        // of (arr[i] - i)
        var map = {};
        for (var i = 0; i < n; i++) map[arr[i] - i] = 0;
 
        for (var i = 0; i < n; i++) map[arr[i] - i]++;
 
        // To store the required count
        var res = 0;
        for (const [key, value] of Object.entries(map)) {
          var cnt = value;
 
          // If cnt is the number of elements
          // whose difference with their index
          // is same then ((cnt * (cnt - 1)) / 2)
          // such pairs are possible
          res += (cnt * (cnt - 1)) / 2;
        }
        return res;
      }
 
      // Driver code
      var arr = [1, 5, 6, 7, 9];
      var n = arr.length;
 
      document.write(countPairs(arr, n));
    </script>


Output: 

3

 

Time Complexity: O(n)

Auxiliary Space: O(n)



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads