Given an array a[] of size N which consists of both positive and negative integers, the task is to find the index of the array for which the average of all the even elements on its LHS is Greater than the average of all the odd elements on its RHS (Follow 0-based Indexing).
Note:
- The First Index and Last Index Cannot be valid answers because the first index will not have any elements on its LHS as well as last index will not have any elements on its RHS.
- If there are multiple indices satisfying the above condition then return the smallest valid index as an answer.
- Else if there is no such index in the given array then return -1.
Examples:
Input: a[] = {4, 6, 1, 6, 5, 3} Output: 1 Explanation: The average of even numbers in the array before index 1 is 4 (elements = {4}) and the average of odd numbers in array a[] after index 1 (elements = { 1, 3, 5} ) is 3. Here Floor Value Is Considered While calculating the average hence smallest valid index is 1.
Input: a[] = { 1,5,3,4,6} Output: -1 Explanation: In the given array there is no such index that satisfies the above condition because
- LHS Even average for every index in the given array is {0, 0, 0, 0, 4}
- RHS Odd average for every index in the given array is {2, 3, 0, 0, 0}
- There is no such index that satisfies the given condition.
- Hence – 1 is the answer.
Approach: To solve the problem follow the below steps:
- Create an Prefix Even Average array and Suffix Odd Average array of length N.
- Iterate array a[] over loop from 0 to N-1 and use average variable to track the average of even numbers and assign PrefixEvenAverage[i]=average .
- If current number is even then add and update the average , do it for all indices of array a[]
- In a Similar Way iterate array a[] over loop from N-1 to 0 for calculating Suffix Odd Average array values.
- Initialize a answer variable with -1 for storing the answer.
- Then Check For Every index from 1 to N and if the index is satisfying the condition mentioned in question then store the index in answer variable and break the loop.
- Return The Answer.
Below is the code to implement the above approach:
C++
#include <bits/stdc++.h>
#include <iostream>
using namespace std;
int findValidIndex( int a[], int n)
{
vector< int > prefixEvenAverage(n), suffixOddAverage(n);
int evenSum = 0, evenAverage = 0, evenLength = 0,
oddSum = 0, oddAverage = 0, oddLength = 0,
answer = -1;
for ( int i = 0; i < n; i++) {
prefixEvenAverage[i] = evenAverage;
if (a[i] % 2 == 0) {
evenSum = evenSum + a[i];
evenLength++;
evenAverage = evenSum / evenLength;
}
}
for ( int i = n - 1; i >= 0; i--) {
suffixOddAverage[i] = oddAverage;
if (a[i] % 2 != 0) {
oddSum = oddSum + a[i];
oddLength++;
oddAverage = oddSum / oddLength;
}
}
for ( int i = 1; i < n - 1; i++) {
if (prefixEvenAverage[i] > suffixOddAverage[i]) {
answer = i;
break ;
}
}
return answer;
}
int main()
{
int a[] = { 4, 6, 1, 6, 5, 3 };
int n = sizeof (a) / sizeof (a[0]);
cout << findValidIndex(a, n);
return 0;
}
|
Java
import java.io.*;
import java.util.*;
class GFG {
public static int findValidIndex( int [] a, int n)
{
List<Integer> prefixEvenAverage
= new ArrayList<>(n);
List<Integer> suffixOddAverage = new ArrayList<>(n);
int evenSum = 0 , evenAverage = 0 , evenLength = 0 ,
oddSum = 0 , oddAverage = 0 , oddLength = 0 ,
answer = - 1 ;
for ( int i = 0 ; i < n; i++) {
prefixEvenAverage.add(evenAverage);
if (a[i] % 2 == 0 ) {
evenSum += a[i];
evenLength++;
evenAverage = evenSum / evenLength;
}
}
for ( int i = n - 1 ; i >= 0 ; i--) {
suffixOddAverage.add(oddAverage);
if (a[i] % 2 != 0 ) {
oddSum += a[i];
oddLength++;
oddAverage = oddSum / oddLength;
}
}
for ( int i = 1 ; i < n - 1 ; i++) {
if (prefixEvenAverage.get(i)
> suffixOddAverage.get(i)) {
answer = i;
break ;
}
}
return answer;
}
public static void main(String[] args)
{
int [] a = { 4 , 6 , 1 , 6 , 5 , 3 };
int n = a.length;
System.out.println(findValidIndex(a, n));
}
}
|
Python
def findValidIndex(arr):
n = len (arr)
prefix_even_average = [ 0 ] * n
suffix_odd_average = [ 0 ] * n
even_sum = 0
even_average = 0
even_length = 0
odd_sum = 0
odd_average = 0
odd_length = 0
answer = - 1
for i in range (n):
prefix_even_average[i] = even_average
if arr[i] % 2 = = 0 :
even_sum + = arr[i]
even_length + = 1
even_average = even_sum / even_length
for i in range (n - 1 , - 1 , - 1 ):
suffix_odd_average[i] = odd_average
if arr[i] % 2 ! = 0 :
odd_sum + = arr[i]
odd_length + = 1
odd_average = odd_sum / odd_length
for i in range ( 1 , n - 1 ):
if prefix_even_average[i] > suffix_odd_average[i]:
answer = i
break
return answer
if __name__ = = "__main__" :
arr = [ 4 , 6 , 1 , 6 , 5 , 3 ]
print (findValidIndex(arr))
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static int FindValidIndex( int [] a, int n)
{
List< int > prefixEvenAverage = new List< int >(n);
List< int > suffixOddAverage = new List< int >(n);
int evenSum = 0, evenAverage = 0, evenLength = 0,
oddSum = 0, oddAverage = 0, oddLength = 0,
answer = -1;
for ( int i = 0; i < n; i++)
{
prefixEvenAverage.Add(evenAverage);
if (a[i] % 2 == 0)
{
evenSum += a[i];
evenLength++;
evenAverage = evenSum / evenLength;
}
}
for ( int i = n - 1; i >= 0; i--)
{
suffixOddAverage.Insert(0, oddAverage);
if (a[i] % 2 != 0)
{
oddSum += a[i];
oddLength++;
oddAverage = oddSum / oddLength;
}
}
for ( int i = 1; i < n - 1; i++)
{
if (prefixEvenAverage[i] > suffixOddAverage[i])
{
answer = i;
break ;
}
}
return answer;
}
static void Main()
{
int [] a = { 4, 6, 1, 6, 5, 3 };
int n = a.Length;
Console.WriteLine(FindValidIndex(a, n));
}
}
|
Javascript
function findValidIndex(arr) {
const prefixEvenAverage = new Array(arr.length);
const suffixOddAverage = new Array(arr.length);
let evenSum = 0;
let evenAverage = 0;
let evenLength = 0;
let oddSum = 0;
let oddAverage = 0;
let oddLength = 0;
let answer = -1;
for (let i = 0; i < arr.length; i++) {
prefixEvenAverage[i] = evenAverage;
if (arr[i] % 2 === 0) {
evenSum += arr[i];
evenLength++;
evenAverage = evenSum / evenLength;
}
}
for (let i = arr.length - 1; i >= 0; i--) {
suffixOddAverage[i] = oddAverage;
if (arr[i] % 2 !== 0) {
oddSum += arr[i];
oddLength++;
oddAverage = oddSum / oddLength;
}
}
for (let i = 1; i < arr.length - 1; i++) {
if (prefixEvenAverage[i] > suffixOddAverage[i]) {
answer = i;
break ;
}
}
return answer;
}
const a = [4, 6, 1, 6, 5, 3];
console.log(findValidIndex(a));
|
Time Complexity: O(N), where N is the length of the array. Auxiliary Space: O(N), where N is the length of the array.
|