Count of pairs of Array elements with average at least K
Last Updated :
28 Mar, 2023
Given an array A[] of size N consisting of N integers, the task is to count the number of pairs such that their average is greater or equal to K.
Example:
Input: N = 4, K = 3, A = {5, 1, 3, 4}
Output: 4
Explanation: (5, 1), (5, 3), (5, 4) and (3, 4) are the required pairs with average greater or equal to K = 3.
Input: N = 3, K = 3, A = {1, 2, 3}
Output: 0
Explanation: No pairs exist with average greater or equal to K = 3.
Approach: This problem can be solved using binary search for the first occurrence of an element in based on the following observation:
- Just need to find 2*K - A[i] because average of two numbers X and Y is K ≤ (X+Y)/2. Now replace X with the current element that we are traversing i.e A[i] then equation becomes Y ≥ 2*K-A[i].
- So for any element A[i] in the array A[] total number of pairs formed are all the numbers in A[] that are greater than or equal to 2*K-A[i] i.e size of array 'A' -index of 2*K-A[i].
- So go as left as possible in A[] and for that find the first occurrence of 2*K-A[i]. If 2*K-A[i] is not found in A[] then return the index of next greater element of 2*K-A[i] because if average ≤ (X+Y)/2 for any two integers then also average ≤ (X+Z)/2 for all Z ≥ Y.
Follow the below steps to solve this problem:
- Sort the array A[].
- Traverse the array A[].
- Find the first occurrence of 2*k-A[i] for every element A[i] in A.
- If 2*k-A[i] does not exist then find the first occurrence of an element just greater than 2*k-A[i] in the array A and store its result in a variable (say ind).
- If ind is not -1, then add N-ind in the answer.
- Return the final answer after the traversal is over.
Below is the implementation of the above approach:
C++14
// C++ code to implement the approach
#include <bits/stdc++.h>
using namespace std;
// Function to return the index of 2*K-A[i]
int findElement(int A[], int low,
int high, int key)
{
int ans = -1;
// Binary search
while (low <= high) {
int mid = low + (high - low) / 2;
if (key <= A[mid]) {
ans = mid;
high = mid - 1;
}
else
low = mid + 1;
}
return ans;
}
// Count the number of pairs
int countPairs(int A[], int& N, int& k)
{
sort(A, A + N);
int count = 0;
// Loop to count the number of pairs
for (int i = 0; i < N; i++) {
int index
= findElement(A, i + 1, N - 1,
2 * k - A[i]);
if (index != -1)
count += N - index;
}
return count;
}
// Driver Code
int main()
{
int A[] = { 5, 1, 3, 4 };
int N = sizeof(A) / sizeof(A[0]);
int K = 3;
// Function call
cout << countPairs(A, N, K);
return 0;
}
Java
// Java code to implement the approach
import java.util.*;
class GFG {
// Function to return the index of 2*K-A[i]
static int findElement(int A[], int low,
int high, int key)
{
int ans = -1;
// Binary search
while (low <= high) {
int mid = low + (high - low) / 2;
if (key <= A[mid]) {
ans = mid;
high = mid - 1;
}
else
low = mid + 1;
}
return ans;
}
// Count the number of pairs
static int countPairs(int A[], int N, int k)
{
Arrays.sort(A);
int count = 0;
// Loop to count the number of pairs
for (int i = 0; i < N; i++) {
int index
= findElement(A, i + 1, N - 1,
2 * k - A[i]);
if (index != -1)
count += N - index;
}
return count;
}
// Driver Code
public static void main (String[] args) {
int A[] = { 5, 1, 3, 4 };
int N = A.length;
int K = 3;
// Function call
System.out.print(countPairs(A, N, K));
}
}
// This code is contributed by hrithikgarg03188.
Python3
# Python3 program for above approach
# Function to return the index of 2*K-A[i]
def findElement(A, low, high, key):
ans = -1
# binary search
while (low <= high):
mid = low + (high - low)//2
if key <= A[mid]:
ans = mid
high = mid - 1
else:
low = mid + 1
return ans
# Count the number of pairs
def countPairs(A, N, k):
A.sort()
count = 0
# Loop to count the number of pairs
for i in range(N):
index = findElement(A, i + 1, N - 1, 2 * k - A[i])
if index != -1:
count += N - index
return count
# Driver code
A = [5, 1, 3, 4]
N = len(A)
K = 3
# Function call
print(countPairs(A, N, K))
# this code is contributed by phasing17
C#
// C# code to implement the approach
using System;
public class GFG {
// Function to return the index of 2*K-A[i]
static int findElement(int[] A, int low, int high,
int key)
{
int ans = -1;
// Binary search
while (low <= high) {
int mid = low + (high - low) / 2;
if (key <= A[mid]) {
ans = mid;
high = mid - 1;
}
else
low = mid + 1;
}
return ans;
}
// Count the number of pairs
static int countPairs(int[] A, int N, int k)
{
Array.Sort(A);
int count = 0;
// Loop to count the number of pairs
for (int i = 0; i < N; i++) {
int index = findElement(A, i + 1, N - 1,
2 * k - A[i]);
if (index != -1)
count += N - index;
}
return count;
}
// Driver Code
static public void Main()
{
int[] A = { 5, 1, 3, 4 };
int N = A.Length;
int K = 3;
// Function call
Console.Write(countPairs(A, N, K));
}
}
// This code is contributed by Rohit Pradhan
JavaScript
<script>
// JavaScript code for the above approach
// Function to return the index of 2*K-A[i]
function findElement(A, low,
high, key) {
let ans = -1;
// Binary search
while (low <= high) {
let mid = low + Math.floor((high - low) / 2);
if (key <= A[mid]) {
ans = mid;
high = mid - 1;
}
else
low = mid + 1;
}
return ans;
}
// Count the number of pairs
function countPairs(A, N, k) {
A.sort(function (a, b) { return a - b });
let count = 0;
// Loop to count the number of pairs
for (let i = 0; i < N; i++) {
let index
= findElement(A, i + 1, N - 1,
2 * k - A[i]);
if (index != -1)
count += N - index;
}
return count;
}
// Driver Code
let A = [5, 1, 3, 4];
let N = A.length;
let K = 3;
// Function call
document.write(countPairs(A, N, K));
// This code is contributed by Potta Lokesh
</script>
Time Complexity: O(N log N)
Auxiliary Space: O(N)
Another Approach:
- Sort the array A[] in non-decreasing order using std::sort() function.
- Initialize a count variable to zero which will keep track of the number of pairs that have an average greater than or equal to K.
- Loop through the array A[] from left to right.
- For each element A[i], calculate the target value using the formula 2K - A[i]. This is because for two numbers X and Y, their average is greater than or equal to K if and only if (X + Y)/2 >= K, which simplifies to X + Y >= 2K.
- Use binary search to find the index of the first element in the array A[] that is greater than or equal to the target value. Initialize left to i + 1 and right to N - 1, and repeat until left > right. Inside the loop, calculate mid as the average of left and right, and compare A[mid] with the target value. If A[mid] is greater than or equal to the target, set right to mid - 1, otherwise set left to mid + 1.
- After the binary search, the index variable should contain the index of the first element in A[] that is greater than or equal to the target value. If index is less than N, then there are N - index pairs (A[i], A[j]), where i < j and A[j] >= target, that have an average greater than or equal to K. Add this count to the overall count variable.
- After the loop, return the count variable as the final answer.
Example:
C++
// C++ code to implement the approach
#include <bits/stdc++.h>
using namespace std;
// Function to return the index of 2*K-A[i]
int countPairs(int A[], int& N, int& K)
{
sort(A, A + N);
int count = 0;
// Loop to count the number of pairs
for (int i = 0; i < N; i++) {
int target = 2*K - A[i];
int left = i + 1, right = N - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (A[mid] >= target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
int index = left;
if (index != N)
count += N - index;
}
return count;
}
// Driver Code
int main()
{
int A[] = { 5, 1, 3, 4 };
int N = sizeof(A) / sizeof(A[0]);
int K = 3;
// Function call
cout << countPairs(A, N, K);
return 0;
}
C#
// C# code to implement the approach
using System;
public class Program {
// Function to return the index of 2*K-A[i]
public static int CountPairs(int[] A, int N, int K) {
Array.Sort(A);
int count = 0;
// Loop to count the number of pairs
for (int i = 0; i < N; i++) {
int target = 2 * K - A[i];
int left = i + 1, right = N - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (A[mid] >= target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
int index = left;
if (index != N)
count += N - index;
}
return count;
}
public static void Main() {
int[] A = { 5, 1, 3, 4 };
int N = A.Length;
int K = 3;
int result = CountPairs(A, N, K);
Console.WriteLine(result);
}
}
Python3
# Python code to implement the approach
def countPairs(A, N, K):
A.sort()
count = 0
# Loop to count the number of pairs
for i in range(N):
target = 2 * K - A[i]
left, right = i + 1, N - 1
while left <= right:
mid = left + (right - left) // 2
if A[mid] >= target:
right = mid - 1
else:
left = mid + 1
index = left
if index != N:
count += N - index
return count
# Driver code
A = [5, 1, 3, 4]
N = len(A)
K = 3
result = countPairs(A, N, K)
print(result)
Java
// Java code to implement the approach
import java.util.Arrays;
class Main {
// Function to return the index of 2*K-A[i]
static int countPairs(int[] A, int N, int K)
{
Arrays.sort(A);
int count = 0;
// Loop to count the number of pairs
for (int i = 0; i < N; i++) {
int target = 2 * K - A[i];
int left = i + 1, right = N - 1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (A[mid] >= target) {
right = mid - 1;
}
else {
left = mid + 1;
}
}
int index = left;
if (index != N)
count += N - index;
}
return count;
}
// Driver code
public static void main(String[] args)
{
int[] A = { 5, 1, 3, 4 };
int N = A.length;
int K = 3;
// Function call
System.out.println(countPairs(A, N, K));
}
}
JavaScript
function countPairs(A, N, K) {
A.sort(function(a, b) { return a - b; });
let count = 0;
for (let i = 0; i < N; i++) {
let target = 2 * K - A[i];
let left = i + 1, right = N - 1;
while (left <= right) {
let mid = Math.floor((left + right) / 2);
if (A[mid] >= target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
let index = left;
if (index != N)
count += N - index;
}
return count;
}
let A = [5, 1, 3, 4];
let N = A.length;
let K = 3;
let result = countPairs(A, N, K);
console.log(result);
Time Complexity: O(N*logN)
Auxiliary Space: O(1)
Similar Reads
Count of subarrays of size K with average at least M Given an array arr[] consisting of N integers and two positive integers K and M, the task is to find the number of subarrays of size K whose average is at least M. Examples: Input: arr[] = {2, 3, 3, 4, 4, 4, 5, 6, 6}, K = 3, M = 4Output: 4Explanation:Below are the subarrays of size K(= 3) whose aver
7 min read
Count occurrences of the average of array elements with a given number Given an array of N integers and an integer x . For every integer of the array a[i], the task is to calculate the count of numbers in the array with value equals to the average of element a[i] and x. That is, the number of occurrences of the (average of element a[i] and x) in the array. Examples: In
7 min read
Count of square submatrices with average at least K Given a matrix arr[][] of size NxM and an integer K, the task is to find the count of square submatrices in the given matrix with the average of elements greater than or equal to K. Examples: Input: K = 4, arr[][] = {{2, 2, 3}, {3, 4, 5}, {4, 5, 5}}Output: 7Explanation: The following square submatri
12 min read
Count of pairs of Array elements which are divisible by K when concatenated Given an array arr[] and an integer K, the task is to count the pair of indices (i, j) such that i !=j and concatenation of a[i] and a[j] is divisible by K. Example: Input: arr[] = [4, 5, 2], K = 2 Output: 4 Explanation: All possible concatenations are {45, 42, 54, 52, 24, 25}. Out of these, the num
8 min read
Count of Unique elements after inserting average of MEX and Array Max K times Given an array A[] of N non-negative integers and an integer K. Each time, you can do the following two operations Find Average of MAX and MEX(rounded up to closest greater integer) of the array.Insert calculated average in the array. After performing the above operation K times, find the count of u
9 min read