Check if given array can be rearranged such that mean is equal to median
Given sorted float array arr[]. Check if arr[] can be rearranged such that its mean is equal to its median.
Examples:
Input: arr[] = {1.0, 3.0, 6.0, 9.0, 12.0, 32.0}
Output: Yes
Explanation: The mean of given array is (1.0 + 3.0 + 6.0 + 9.0 + 12.0 + 32.0) / 6 = 10.5.
Rearranging given array as {1.0, 3.0, 9.0, 12.0, 6.0, 32.0}, here median is (9.0 + 12.0) / 2 = 10.5
Input: arr[] = {8.0, 13.0, 15.0}
Output: No
Approach: The given problem can be solved by using Binary Search and Two Pointers approach. If size of arr[] is odd that means the median is a single element that can be searched by using Binary search. If array size is even then Two pointers approach can be used because then median will be composed of two elements. Follow the steps below to solve the given problem.
- Initialize a variable say, mean to store mean of arr[].
- Check if the size of arr[] is even or odd.
- if size of arr[] is even
- Use Two Pointers approach to search two elements whose average = mean.
- Initialize two pointers as i=0, j=n-1.
- Perform two pointers approach to search for the median in arr[].
- if size of arr[] is odd
- Apply Binary Search to find if mean is present in arr[] or not.
- If it is mean is found return Yes, otherwise No.
Below is the implementation of the above approach:
C++
#include <iostream>
using namespace std;
bool binarySearch( float arr[], int size, float key)
{
int low = 0, high = size - 1, mid;
while (low <= high) {
mid = low + (high - low) / 2;
if (key > arr[mid])
low = mid + 1;
else if (key < arr[mid])
high = mid - 1;
else
return 1;
}
return 0;
}
bool twoPointers( float arr[], int N, float mean)
{
int i = 0, j = N - 1;
while (i < j) {
float temp = (arr[i] + arr[j]) / 2;
if (temp > mean)
j--;
else if (temp < mean)
i++;
else
return 1;
}
return 0;
}
bool checkArray( float arr[], int N)
{
float sum = 0;
for ( int i = 0; i < N; i++)
sum += arr[i];
float mean = sum / N;
if (N & 1)
return binarySearch(arr, N, mean);
else
return twoPointers(arr, N, mean);
}
int main()
{
float arr[] = { 1.0, 3.0, 6.0, 9.0, 12.0, 32.0 };
int N = sizeof (arr) / sizeof (arr[0]);
if (checkArray(arr, N))
cout << "Yes" ;
else
cout << "No" ;
return 0;
}
|
Java
import java.io.*;
public class GFG{
static boolean binarySearch( float []arr, int size, float key)
{
int low = 0 , high = size - 1 , mid;
while (low <= high) {
mid = low + (high - low) / 2 ;
if (key > arr[mid])
low = mid + 1 ;
else if (key < arr[mid])
high = mid - 1 ;
else
return true ;
}
return false ;
}
static boolean twoPointers( float []arr, int N, float mean)
{
int i = 0 , j = N - 1 ;
while (i < j) {
float temp = (arr[i] + arr[j]) / 2 ;
if (temp > mean)
j--;
else if (temp < mean)
i++;
else
return true ;
}
return false ;
}
static boolean checkArray( float []arr, int N)
{
float sum = 0 ;
for ( int i = 0 ; i < N; i++)
sum += arr[i];
float mean = sum / N;
if ((N & 1 )!= 0 )
return binarySearch(arr, N, mean);
else
return twoPointers(arr, N, mean);
}
public static void main(String []args)
{
float []arr = { 1 .0f, 3 .0f, 6 .0f, 9 .0f, 12 .0f, 32 .0f };
int N = arr.length;
if (checkArray(arr, N))
System.out.println( "Yes" );
else
System.out.println( "No" );
}
}
|
Python3
def binarySearch(arr, size, key):
low = 0
high = size - 1
while (low < = high):
mid = low + (high - low) / / 2
if (key > arr[mid]):
low = mid + 1
elif (key < arr[mid]):
high = mid - 1
else :
return 1
return 0
def twoPointers(arr, N, mean):
i = 0
j = N - 1
while (i < j):
temp = (arr[i] + arr[j]) / 2
if (temp > mean):
j = j - 1
elif (temp < mean):
i = i + 1
else :
return 1
return 0
def checkArray(arr, N):
sum = 0
for i in range ( 0 , N):
sum + = arr[i]
mean = sum / N
if (N & 1 ):
return binarySearch(arr, N, mean)
else :
return twoPointers(arr, N, mean)
if __name__ = = "__main__" :
arr = [ 1.0 , 3.0 , 6.0 , 9.0 , 12.0 , 32.0 ]
N = len (arr)
if (checkArray(arr, N)):
print ( "Yes" )
else :
print ( "No" )
|
C#
using System;
using System.Collections.Generic;
class GFG{
static bool binarySearch( float []arr, int size, float key)
{
int low = 0, high = size - 1, mid;
while (low <= high) {
mid = low + (high - low) / 2;
if (key > arr[mid])
low = mid + 1;
else if (key < arr[mid])
high = mid - 1;
else
return true ;
}
return false ;
}
static bool twoPointers( float []arr, int N, float mean)
{
int i = 0, j = N - 1;
while (i < j) {
float temp = (arr[i] + arr[j]) / 2;
if (temp > mean)
j--;
else if (temp < mean)
i++;
else
return true ;
}
return false ;
}
static bool checkArray( float []arr, int N)
{
float sum = 0;
for ( int i = 0; i < N; i++)
sum += arr[i];
float mean = sum / N;
if ((N & 1)!=0)
return binarySearch(arr, N, mean);
else
return twoPointers(arr, N, mean);
}
public static void Main()
{
float []arr = { 1.0f, 3.0f, 6.0f, 9.0f, 12.0f, 32.0f };
int N = arr.Length;
if (checkArray(arr, N))
Console.Write( "Yes" );
else
Console.Write( "No" );
}
}
|
Javascript
<script>
const binarySearch = (arr, size, key) => {
let low = 0, high = size - 1, mid;
while (low <= high) {
mid = low + parseInt((high - low) / 2);
if (key > arr[mid])
low = mid + 1;
else if (key < arr[mid])
high = mid - 1;
else
return 1;
}
return 0;
}
const twoPointers = (arr, N, mean) => {
let i = 0, j = N - 1;
while (i < j) {
let temp = (arr[i] + arr[j]) / 2;
if (temp > mean)
j--;
else if (temp < mean)
i++;
else
return 1;
}
return 0;
}
const checkArray = (arr, N) => {
let sum = 0;
for (let i = 0; i < N; i++)
sum += arr[i];
let mean = sum / N;
if (N & 1)
return binarySearch(arr, N, mean);
else
return twoPointers(arr, N, mean);
}
let arr = [1.0, 3.0, 6.0, 9.0, 12.0, 32.0];
let N = arr.length;
if (checkArray(arr, N))
document.write( "Yes" );
else
document.write( "No" );
</script>
|
Time Complexity: O(N), when N is even.
O(logN), when N is odd.
Auxiliary Space: O(1).
Last Updated :
24 Sep, 2021
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...