DEV Community

shashi
shashi

Posted on

2 1 1 1 1

Count Pairs in an Array

Count Pairs in an Array

HardAccuracy: 48.25%Submissions: 24K+Points: 8

Given an array arr of n integers, count all pairs (arr[i], arr[j]) in it such that i*arr[i] > j*arr[j] **and **0 ≤ i < j < n.

Note: 0-based Indexing is followed.

Example 1:

Input :
n = 4
arr[] = {8, 4, 2, 1}
Output :
2
Explanation:
If we see the array after operations
[0*8, 1*4, 2*2, 3*1] => [0, 4, 4, 3]
Pairs which hold the condition i*arr[i] > j*arr[j] are (4,1) and (2,1), so in total 2 pairs are available.
Enter fullscreen mode Exit fullscreen mode

Example 2:

Input :
n = 7
arr[] = {5, 0, 10, 2, 4, 1, 6}
Output:
5
Explanation :
Pairs which hold the condition i*arr[i] > j*arr[j] are (10,2), (10,4), (10,1), (2,1) and (4,1), so in total 5 pairs are there.
Enter fullscreen mode Exit fullscreen mode

Your Task: **
You don’t need to read input or print anything. Your task is to complete the function **countPairs()
which takes the array arr[] and its size **n **as inputs and returns the required result.

**Expected Time Complexity: **O(n*log(n))
**Expected Auxiliary Space: **O(n*log(n))

Constraints:
1 n *≤ **104
0 ≤ arr[i] *
≤ **104

Topic Tags

Report An Issue

//User function Template for Java


//define a pair class 


class Solution {  

    //Time :O(n^2) space :O(1)
    static int countPairs1(int arr[], int n) 
    {
         // Your code goes here
         int c=0;
         for(int i=0;i<n;i++){
             for(int j=i+1; j<n ; j++){
                 if(i*arr[i] > j*arr[j]) c++;
             }
         }
         return c;
    }

    /*Time : O(n*(log(n)) Space : O(n*log(n))*/
    static int countPairs(int arr[], int n) 
    {
        //find the product of index and value store it in same array
        for(int i=0;i<n;i++)arr[i]*=i;

        return mergeSort(arr,0, n-1);
    }
    static int mergeSort(int[]arr, int l, int r){
        int count = 0;
        if(l<r){
            int mid = l+(r-l)/2;
            count += mergeSort(arr,l,mid);
            count += mergeSort(arr, mid+1,r);

            count += merge(arr,l,mid,r);
        }
        return count;
    }

    static int merge(int[]arr, int l, int mid, int r){
        int count = 0;

        int j = mid+1;

        /*  finding pair */
        for(int i=l; i<=mid; i++){

         while(j<=r && arr[i]>arr[j] ) j++;
          count+= (j-(mid+1));

        }


      /*calculate the size of left sub array & right sub array*/
        int n = mid-l+1;
        int m = r-mid;


    /*declare the left sub array and righ sub array*/
        int[]left = new int[n];
        int[]right = new int[m];


    /*copy the data from input array to left , right sub array*/
        for(int i=0;i<n;i++){
            left[i] = arr[l+i];
        }
        for(int i=0;i<m;i++){
            right[i] = arr[mid+i+1];
        }



        /*declare the iterator indx variables for input array, left, right sub array */
        int i=0;
        j = 0;
        int k = l;

        /*iterate untill out of  bounce */
        while(i<n && j<m){

            /*copyt the min element from right, left subarray to input array*/
            if(left[i]<=right[j]){
                arr[k++] = left[i++];
            }else{
                arr[k++] = right[j++];
            }
        }

        /*copyt the elements remaining from both the arrays*/
        while(i<n)arr[k++] = left[i++];
        while(j<m)arr[k++] = right[j++];

        return count;
    }

}

/*

Count Pairs in an Array
HardAccuracy: 48.25%Submissions: 24K+Points: 8
Given an array arr of n integers, count all pairs (arr[i], arr[j]) in it such that i*arr[i] > j*arr[j] and 0 ≤ i < j < n.

Note: 0-based Indexing is followed.

Example 1:

Input :
n = 4
arr[] = {8, 4, 2, 1}
Output :
2
Explanation:
If we see the array after operations
[0*8, 1*4, 2*2, 3*1] => [0, 4, 4, 3]
Pairs which hold the condition i*arr[i] > j*arr[j] are (4,1) and (2,1), so in total 2 pairs are available.
Example 2:

Input :
n = 7
arr[] = {5, 0, 10, 2, 4, 1, 6}
Output:
5
Explanation :
Pairs which hold the condition i*arr[i] > j*arr[j] are (10,2), (10,4), (10,1), (2,1) and (4,1), so in total 5 pairs are there.
Your Task:  
You don't need to read input or print anything. Your task is to complete the function countPairs() which takes the array arr[] and its size n as inputs and returns the required result.

Expected Time Complexity: O(n*log(n))
Expected Auxiliary Space: O(n*log(n))

Constraints:
1 ≤ n ≤ 104
0 ≤ arr[i] ≤ 104


*/
Enter fullscreen mode Exit fullscreen mode

Image of Datadog

How to Diagram Your Cloud Architecture

Cloud architecture diagrams provide critical visibility into the resources in your environment and how they’re connected. In our latest eBook, AWS Solution Architects Jason Mimick and James Wenzel walk through best practices on how to build effective and professional diagrams.

Download the Free eBook

Top comments (0)