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: 1
The only valid pair is (arr[0], arr[2]) as 7 – 5 = 2 – 0 = 2.
Input: arr[] = {1, 2, 3, 4}
Output: 6
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> |
3
Time Complexity: O(n)
Auxiliary Space: O(n)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!