Divide array into two sub-arrays such that their averages are equal
Last Updated :
07 Jul, 2022
Given an integer array, the task is to divide an integer array into two sub-arrays to make their averages equal if possible.
Examples :
Input : arr[] = {1, 5, 7, 2, 0};
Output : (0 1) and (2 4)
Subarrays arr[0..1] and arr[2..4] have
same average.
Input : arr[] = {4, 3, 5, 9, 11};
Output : Not possible
Asked in Microsoft
A Naive Approach is to run two loops and find subarrays whose averages are equal.
Implementation:
C++
#include<bits/stdc++.h>
using namespace std;
void findSubarrays( int arr[], int n)
{
bool found = false ;
int lsum = 0;
for ( int i = 0; i < n - 1; i++)
{
lsum += arr[i];
int rsum = 0;
for ( int j = i + 1; j < n; j++)
rsum += arr[j];
if (lsum * (n - i - 1) ==
rsum * (i + 1))
{
printf ( "From (%d %d) to (%d %d)\n" ,
0, i, i + 1, n - 1);
found = true ;
}
}
if (found == false )
cout << "Subarrays not found"
<< endl;
}
int main()
{
int arr[] = {1, 5, 7, 2, 0};
int n = sizeof (arr) / sizeof (arr[0]);
findSubarrays(arr, n);
return 0;
}
|
Java
public class GFG {
static void findSubarrays( int [] arr, int n)
{
boolean found = false ;
int lsum = 0 ;
for ( int i = 0 ; i < n - 1 ; i++)
{
lsum += arr[i];
int rsum = 0 ;
for ( int j = i + 1 ; j < n; j++)
rsum += arr[j];
if (lsum * (n - i - 1 ) ==
rsum * (i + 1 ))
{
System.out.println( "From (0 " + i
+ ") to (" +(i + 1 ) + " "
+ (n - 1 )+ ")" );
found = true ;
}
}
if (found == false )
System.out.println( "Subarrays not "
+ "found" );
}
static public void main (String[] args)
{
int [] arr = { 1 , 5 , 7 , 2 , 0 };
int n = arr.length;
findSubarrays(arr, n);
}
}
|
Python 3
def findSubarrays(arr, n):
found = False
lsum = 0
for i in range (n - 1 ):
lsum + = arr[i]
rsum = 0
for j in range (i + 1 , n):
rsum + = arr[j]
if (lsum * (n - i - 1 ) = = rsum * (i + 1 )):
print ( "From" , "(" , 0 , i, ")" ,
"to" , "(" , i + 1 , n - 1 , ")" )
found = True
if (found = = False ):
print ( "Subarrays not found" )
if __name__ = = "__main__" :
arr = [ 1 , 5 , 7 , 2 , 0 ]
n = len (arr)
findSubarrays(arr, n)
|
C#
using System;
public class GFG {
static void findSubarrays( int []arr, int n)
{
bool found = false ;
int lsum = 0;
for ( int i = 0; i < n - 1; i++)
{
lsum += arr[i];
int rsum = 0;
for ( int j = i + 1; j < n; j++)
rsum += arr[j];
if (lsum * (n - i - 1) ==
rsum * (i + 1))
{
Console.WriteLine( "From ( 0 " + i
+ ") to(" + (i + 1) + " "
+ (n - 1) + ")" );
found = true ;
}
}
if (found == false )
Console.WriteLine( "Subarrays not "
+ "found" );
}
static public void Main ()
{
int []arr = {1, 5, 7, 2, 0};
int n = arr.Length;
findSubarrays(arr, n);
}
}
|
PHP
<?php
function findSubarrays( $arr , $n )
{
$found = false;
$lsum = 0;
for ( $i = 0; $i < $n - 1; $i ++)
{
$lsum += $arr [ $i ];
$rsum = 0;
for ( $j = $i + 1; $j < $n ; $j ++)
$rsum += $arr [ $j ];
if ( $lsum * ( $n - $i - 1) ==
$rsum * ( $i + 1))
{
echo "From ( 0 " , $i , " )" .
" to (" , $i + 1, " " , $n - 1, ")\n" ;
$found = true;
}
}
if ( $found == false)
echo "Subarrays not found" ;
}
$arr = array (1, 5, 7, 2, 0);
$n = count ( $arr );
findSubarrays( $arr , $n );
?>
|
Javascript
<script>
function findSubarrays(arr,n)
{
let found = false ;
let lsum = 0;
for (let i = 0; i < n - 1; i++)
{
lsum += arr[i];
let rsum = 0;
for (let j = i + 1; j < n; j++)
rsum += arr[j];
if (lsum * (n - i - 1) ==
rsum * (i + 1))
{
document.write( "From (0 " + i
+ ") to (" +(i + 1) + " "
+ (n - 1)+ ")" );
found = true ;
}
}
if (found == false )
document.write( "Subarrays not "
+ "found" );
}
let arr=[1, 5, 7, 2, 0];
let n = arr.length;
findSubarrays(arr, n);
</script>
|
Output
From (0 1) to (2 4)
Time complexity : O(n2)
Auxiliary Space : O(1)
An Efficient solution is to find sum of array elements. Initialize leftsum as zero. Run a loop and find leftsum by adding elements of array. For rightsum, we subtract leftsum from total sum then we find rightsum and find average of leftsum and rightsum as according to their index.
1) Compute sum of all array elements. Let this
sum be "sum"
2) Initialize leftsum = 0.
3) Run a loop for i=0 to n-1.
a) leftsum = leftsum + arr[i]
b) rightsum = sum - leftsum
c) If average of left and right are same,
print current index as output.
Below is the implementation for above approach:
C++
#include<bits/stdc++.h>
using namespace std;
void findSubarrays( int arr[], int n)
{
int sum = 0;
for ( int i = 0; i < n; i++)
sum += arr[i];
bool found = false ;
int lsum = 0;
for ( int i = 0; i < n - 1; i++)
{
lsum += arr[i];
int rsum = sum - lsum;
if (lsum * (n - i - 1) == rsum * (i + 1))
{
printf ( "From (%d %d) to (%d %d)\n" ,
0, i, i+1, n-1);
found = true ;
}
}
if (found == false )
cout << "Subarrays not found"
<< endl;
}
int main()
{
int arr[] = {1, 5, 7, 2, 0};
int n = sizeof (arr) / sizeof (arr[0]);
findSubarrays(arr, n);
return 0;
}
|
Java
import java.util.*;
class GFG
{
static void findSubarrays( int arr[], int n)
{
int sum = 0 ;
for ( int i = 0 ; i < n; i++)
sum += arr[i];
boolean found = false ;
int lsum = 0 ;
for ( int i = 0 ; i < n - 1 ; i++)
{
lsum += arr[i];
int rsum = sum - lsum;
if (lsum * (n - i - 1 ) == rsum * (i + 1 ))
{
System.out.printf( "From (%d %d) to (%d %d)\n" ,
0 , i, i + 1 , n - 1 );
found = true ;
}
}
if (found == false )
System.out.println( "Subarrays not found" );
}
static public void main ( String []arg)
{
int arr[] = { 1 , 5 , 7 , 2 , 0 };
int n = arr.length;
findSubarrays(arr, n);
}
}
|
Python3
def findSubarrays(arr, n):
sum = 0 ;
for i in range (n):
sum + = arr[i];
found = False ;
lsum = 0 ;
for i in range (n - 1 ):
lsum + = arr[i];
rsum = sum - lsum;
if (lsum * (n - i - 1 ) = = rsum * (i + 1 )):
print ( "From (%d %d) to (%d %d)\n" %
( 0 , i, i + 1 , n - 1 ));
found = True ;
if (found = = False ):
print ( "Subarrays not found" );
if __name__ = = '__main__' :
arr = [ 1 , 5 , 7 , 2 , 0 ];
n = len (arr);
findSubarrays(arr, n);
|
C#
using System;
class GFG
{
static void findSubarrays( int []arr, int n)
{
int sum = 0;
for ( int i = 0; i < n; i++)
sum += arr[i];
bool found = false ;
int lsum = 0;
for ( int i = 0; i < n - 1; i++)
{
lsum += arr[i];
int rsum = sum - lsum;
if (lsum * (n - i - 1) == rsum * (i + 1))
{
Console.Write( "From ({0} {1}) to ({2} {3})\n" ,
0, i, i + 1, n - 1);
found = true ;
}
}
if (found == false )
Console.WriteLine( "Subarrays not found" );
}
static public void Main ( String []arg)
{
int []arr = {1, 5, 7, 2, 0};
int n = arr.Length;
findSubarrays(arr, n);
}
}
|
Javascript
<script>
function findSubarrays(arr,n)
{
let sum = 0;
for (let i = 0; i < n; i++)
sum += arr[i];
let found = false ;
let lsum = 0;
for (let i = 0; i < n - 1; i++)
{
lsum += arr[i];
let rsum = sum - lsum;
if (lsum * (n - i - 1) == rsum * (i + 1))
{
document.write(
"From (0 " +i+ ") to (" +(i+1)+ " " +(n-1)+ ")\n"
);
found = true ;
}
}
if (found == false )
document.write( "Subarrays not found" );
}
let arr=[1, 5, 7, 2, 0];
let n = arr.length;
findSubarrays(arr, n);
</script>
|
Output
From (0 1) to (2 4)
Time complexity : O(n)
Auxiliary Space : O(1)
Share your thoughts in the comments
Please Login to comment...