Find index with minimum difference between prefix and suffix average of given Array
Last Updated :
06 Apr, 2022
Given an array arr[] of size N, the task is to find an index i such that the difference between prefix average and suffix average is minimum, i.e. average of elements till i (in range [0, i]) and the average of elements after i (in range [i+1, N)) is minimum.
Examples:
Input: arr[] = {2, 9, 3, 5}
Output: 0
Explanation:
At index 0,
Average of price till i = 0 is 2 and the average after it is {9, 3, 5} is 17/3 = 5.67.
So the difference of the average till i and after i is -3.67.
At index 1,
Average of price till i = 1 {2, 9} is 11/2 = 5.5 and the average after it is {3, 5} is 8/2 = 4.
So the difference of the average till i and after i is 1.5.
At index 2,
Average of price till i = 2 {2, 9, 3} is 14/3 = 4.67 and the average after it is 5/1 = 5.
So the difference of the average till i and after i is -0.33.
At index 3,
Average of price till i = 3 {2, 9, 3, 5} is 19/4 = 4.75 and the average after it is 0.
So the difference of the average till i and after i is 4.75.
So the minimum value is in index at index 0.
Input: arr[] = {15, 5, 10, 15, 5}
Output: 1
Approach: The problem can be solved based on prefix sum idea as below:
Use prefix sum technique to calculate the average till ith day and the average after the ith day for every index i. Find the day which has the minimum difference of the averages.
Follow these steps to solve the above problem:
- Initialize and empty prefix_sum[] array to store the prefix sum.
- Traverse through the array and find the prefix sum at every index i.
- Initialize the min_day and min_diff = INT_MAX to store the day and the minimum difference.
- Traverse through the prefix sum array and calculate the left average and right average and store it in the diff variable.
- Check if the difference is less than min_diff and store update the variable min_diff accordingly.
- After processing all, print the min_diff.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void find_the_day( int arr[], int n)
{
int prefix_sum[n];
prefix_sum[0] = arr[0];
for ( int i = 1; i < n; i++) {
prefix_sum[i] = arr[i]
+ prefix_sum[i - 1];
}
int min_diff = INT_MAX;
int min_day;
for ( int i = 0; i < n; i++) {
float left_avg
= prefix_sum[i] / (i + 1);
float right_avg;
if (i == n - 1)
right_avg = 0;
else
right_avg = (prefix_sum[n - 1]
- prefix_sum[i])
/ (n - i - 1);
float diff
= left_avg - right_avg;
if (diff < min_diff) {
min_diff = diff;
min_day = i + 1;
}
}
cout << min_day << endl;
}
int main()
{
int arr[] = { 15, 5, 10, 15, 5 };
int N = sizeof (arr) / sizeof (arr[0]);
find_the_day(arr, N);
return 0;
}
|
Java
import java.util.*;
class GFG
{
public static void find_the_day( int arr[], int n)
{
int prefix_sum[] = new int [n];
prefix_sum[ 0 ] = arr[ 0 ];
for ( int i = 1 ; i < n; i++) {
prefix_sum[i] = arr[i] + prefix_sum[i - 1 ];
}
float min_diff = Float.MAX_VALUE;
int min_day = 0 ;
for ( int i = 0 ; i < n; i++) {
float left_avg = prefix_sum[i] / (i + 1 );
float right_avg;
if (i == n - 1 )
right_avg = 0 ;
else
right_avg
= (prefix_sum[n - 1 ] - prefix_sum[i])
/ (n - i - 1 );
float diff = left_avg - right_avg;
if (diff < min_diff) {
min_diff = ( float )(diff);
min_day = i + 1 ;
}
}
System.out.println(min_day);
}
public static void main(String[] args)
{
int arr[] = { 15 , 5 , 10 , 15 , 5 };
int N = arr.length;
find_the_day(arr, N);
}
}
|
Python3
import sys
def find_the_day(arr, n):
prefix_sum = [ 0 ] * n
prefix_sum[ 0 ] = arr[ 0 ]
for i in range ( 1 ,n):
prefix_sum[i] = arr[i] + prefix_sum[i - 1 ]
min_diff = sys.maxsize
for i in range (n):
left_avg = prefix_sum[i] / (i + 1 )
if (i = = n - 1 ):
right_avg = 0
else :
right_avg = (prefix_sum[n - 1 ]
- prefix_sum[i]) / (n - i - 1 )
diff = left_avg - right_avg
if (diff < min_diff):
min_diff = diff
min_day = i + 1
print (min_day)
arr = [ 15 , 5 , 10 , 15 , 5 ]
N = len (arr)
find_the_day(arr, N)
|
C#
using System;
class GFG
{
static void find_the_day( int []arr, int n)
{
int []prefix_sum = new int [n];
prefix_sum[0] = arr[0];
for ( int i = 1; i < n; i++) {
prefix_sum[i] = arr[i] + prefix_sum[i - 1];
}
float min_diff = Single.MaxValue;
int min_day = 0;
for ( int i = 0; i < n; i++) {
float left_avg = prefix_sum[i] / (i + 1);
float right_avg;
if (i == n - 1)
right_avg = 0;
else
right_avg
= (prefix_sum[n - 1] - prefix_sum[i])
/ (n - i - 1);
float diff = left_avg - right_avg;
if (diff < min_diff) {
min_diff = ( float )(diff);
min_day = i + 1;
}
}
Console.WriteLine(min_day);
}
public static void Main()
{
int []arr = { 15, 5, 10, 15, 5 };
int N = arr.Length;
find_the_day(arr, N);
}
}
|
Javascript
<script>
function find_the_day(arr, n)
{
let prefix_sum = new Array(n);
prefix_sum[0] = arr[0];
for (let i = 1; i < n; i++) {
prefix_sum[i] = arr[i]
+ prefix_sum[i - 1];
}
let min_diff = Number.MAX_VALUE
let min_day;
for (let i = 0; i <n ; i++) {
let left_avg
= prefix_sum[i] / (i + 1);
let right_avg;
if (i == n - 1)
right_avg = 0;
else
right_avg = (prefix_sum[n - 1]
- prefix_sum[i])
/ (n - i - 1);
let diff
= left_avg - right_avg;
if (diff < min_diff) {
min_diff = diff;
min_day = i + 1;
}
}
document.write(min_day, "</br>" );
}
let arr = [ 15, 5, 10, 15, 5 ];
let N = arr.length;
find_the_day(arr, N);
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(N)
Share your thoughts in the comments
Please Login to comment...