Count of pairs from arrays A and B such that element in A is greater than element in B at that index
Last Updated :
25 Oct, 2022
Given two arrays A[] and B[] of size N, the task is to count the maximum number of pairs, where each pair contains one from each array, such that A[i] > B[i]. Also the array A can be rearranged any number of times.
Examples:
Input: A[] = {20, 30, 50}, B[]= {60, 40, 25}
Output: 2
Explanation:
Initially:
A[0] = 20 < B[0] = 60
A[1] = 30 < B[1] = 40
A[2] = 50 > B[2] = 25
Clearly, this arrangement has only 1 value such that A[i] > B[i].
This array A[] when rearranged to {20, 50, 30}:
A[0] = 20 < B[0] = 60
A[1] = 50 > B[1] = 40
A[2] = 30 > B[2] = 25
2 values follow the condition A[i] > B[i] which is the maximum for these set of arrays.
Input: A[] = {10, 3, 7, 5, 8}, B[] = {8, 6, 2, 5, 9}
Output: 4
Explanation:
Initially:
A[0] = 10 > B[0] = 8
A[1] = 3 < B[1] = 6
A[2] = 7 > B[2] = 2
A[3] = 5 = B[3] = 5
A[4] = 8 < B[4] = 9
Clearly, this arrangement has only 2 values such that A[i] > B[i].
This array A[] when rearranged to {10, 8, 5, 7, 3}:
A[0] = 10 > B[0] = 8
A[1] = 8 > B[1] = 6
A[2] = 5 > B[2] = 2
A[3] = 7 > B[3] = 5
A[4] = 3 < B[4] = 9
4 values follow the condition A[i] > B[i] which is the maximum for these set of arrays.
Approach: The idea is to use the concept of heap. Since the arrangement of B[] doesn’t matter in the question, we can perform max heap on both the arrays. After performing max heap and storing the values in two different heaps, iterate through the heap corresponding to A[] and B[] to count the number of indices satisfying the given condition A[i] > B[i].
Below is the implementation of the above approach:
C++14
#include<bits/stdc++.h>
using namespace std;
int check( int A[], int B[], int N)
{
priority_queue < int > pq1,pq2;
for ( int i = 0; i < N; i++) {
pq1.push(A[i]);
}
for ( int i = 0; i < N; i++) {
pq2.push(B[i]);
}
int c = 0;
for ( int i = 0; i < N; i++) {
if (pq1.top()>pq2.top()) {
c++;
pq1.pop();
pq2.pop();
}
else {
if (pq2.size() == 0) {
break ;
}
pq2.pop();
}
}
return (c);
}
int main()
{
int A[] = { 10, 3, 7, 5, 8 };
int B[] = { 8, 6, 2, 5, 9 };
int N = sizeof (A)/ sizeof (A[0]);
cout<<(check(A, B, N));
}
|
Java
import java.util.*;
public class GFG {
static int check( int A[], int B[], int N)
{
PriorityQueue<Integer> pq1
= new PriorityQueue<Integer>(
Collections.reverseOrder());
PriorityQueue<Integer> pq2
= new PriorityQueue<Integer>(
Collections.reverseOrder());
for ( int i = 0 ; i < N; i++) {
pq1.add(A[i]);
}
for ( int i = 0 ; i < N; i++) {
pq2.add(B[i]);
}
int c = 0 ;
for ( int i = 0 ; i < N; i++) {
if (pq1.peek().compareTo(pq2.peek()) == 1 ) {
c++;
pq1.poll();
pq2.poll();
}
else {
if (pq2.size() == 0 ) {
break ;
}
pq2.poll();
}
}
return (c);
}
public static void main(String args[])
{
int A[] = { 10 , 3 , 7 , 5 , 8 };
int B[] = { 8 , 6 , 2 , 5 , 9 };
int N = A.length;
System.out.println(check(A, B, N));
}
}
|
Python3
import heapq
def check(A, B,N):
pq1 = []
pq2 = []
for i in range (N):
heapq.heappush(pq1, - A[i])
for i in range (N):
heapq.heappush(pq2, - B[i])
c = 0
for i in range (N):
if - pq1[ 0 ] > - pq2[ 0 ]:
c + = 1
heapq.heappop(pq1)
heapq.heappop(pq2)
else :
if len (pq2) = = 0 :
break
heapq.heappop(pq2)
return (c)
A = [ 10 , 3 , 7 , 5 , 8 ]
B = [ 8 , 6 , 2 , 5 , 9 ]
N = len (A)
print (check(A, B, N))
|
C#
using System;
using System.Collections.Generic;
class GFG{
static int check( int [] A, int [] B, int N)
{
List< int > pq1 = new List< int >();
List< int > pq2 = new List< int >();
for ( int i = 0; i < N; i++)
{
pq1.Add(A[i]);
}
for ( int i = 0; i < N; i++)
{
pq2.Add(B[i]);
}
pq1.Sort();
pq1.Reverse();
pq2.Sort();
pq2.Reverse();
int c = 0;
for ( int i = 0; i < N; i++)
{
if (pq1[0] > pq2[0])
{
c++;
pq1.RemoveAt(0);
pq2.RemoveAt(0);
}
else
{
if (pq2.Count == 0)
{
break ;
}
pq2.RemoveAt(0);
}
}
return c;
}
static public void Main()
{
int [] A = { 10, 3, 7, 5, 8 };
int [] B = { 8, 6, 2, 5, 9 };
int N = A.Length;
Console.WriteLine(check(A, B, N));
}
}
|
Javascript
<script>
function check(A,B,N)
{
let pq1=[];
let pq2=[];
for (let i = 0; i < N; i++) {
pq1.push(A[i]);
}
for (let i = 0; i < N; i++) {
pq2.push(B[i]);
}
pq1.sort( function (a,b){ return a-b;});
pq1.reverse();
pq2.sort( function (a,b){ return a-b;});
pq2.reverse();
let c = 0;
for (let i = 0; i < N; i++) {
if (pq1[0] > pq2[0]) {
c++;
pq1.shift();
pq2.shift();
}
else {
if (pq2.length == 0) {
break ;
}
pq2.shift();
}
}
return (c);
}
let A=[ 10, 3, 7, 5, 8];
let B=[8, 6, 2, 5, 9 ];
let N = A.length;
document.write(check(A, B, N));
</script>
|
Time Complexity: O(N * log(N))
Auxiliary Space: O(N)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...