Find all indices of Array having value same as average of other elements
Last Updated :
29 Mar, 2022
Given an array arr[] of N integers, the task is to find all indices in the array, such that for each index i the arithmetic mean of all elements except arr[i] is equal to the value of the element at that index.
Examples :
Input: N = 5, arr[] = {1, 2, 3, 4, 5}
Output : {2}
Explanation : Upon removing array element at index 2 (i.e. 3),
arithmetic mean of rest of the array equals (1 + 2 + 4 + 5) / 4 = 3, which is equal to the element at index 2.
It can be seen that 2 is the only such index.
Input : N = 6, arr[] = {5, 5, 5, 5, 5, 5}
Output : {0, 1, 2, 3, 4, 5}
Approach: The problem can be solved by the following idea:
Calculate the total sum of the array and for each element (arr[i]) check if the average of all the other elements is same as arr[i].
Follow the steps to solve the problem:
- Find sum of all elements of the array and store in a variable say sum.
- Traverse the array and,
- At each iteration, find the sum of the array without current element by subtracting current element value from the sum. say, current_sum
- Find the mean of current_sum, by dividing it with N-1
- If mean is equal to the value at current index, push the index in answer vector, else continue.
- Return the answer vector.
Following is the code based on above approach :
C++
#include <bits/stdc++.h>
using namespace std;
vector< int > findIndices( int N, int A[])
{
vector< int > answer;
int sum = 0;
for ( int i = 0; i < N; i++) {
sum += A[i];
}
for ( int i = 0; i < N; i++) {
int curr_sum = sum - A[i];
if (curr_sum % (N - 1) == 0
&& curr_sum / (N - 1) == A[i]) {
answer.push_back(i);
}
}
return answer;
}
int main()
{
int N = 5;
int A[] = { 5, 5, 5, 5, 5 };
vector< int > ans = findIndices(N, A);
for ( int i = 0; i < ans.size(); i++) {
cout << ans[i] << " " ;
}
}
|
Java
import java.util.*;
class GFG {
static Vector<Integer> findIndices( int N, int [] A)
{
Vector<Integer> answer = new Vector<Integer>();
int sum = 0 ;
for ( int i = 0 ; i < N; i++) {
sum += A[i];
}
for ( int i = 0 ; i < N; i++) {
int curr_sum = sum - A[i];
if (curr_sum % (N - 1 ) == 0
&& curr_sum / (N - 1 ) == A[i]) {
answer.add(i);
}
}
return answer;
}
public static void main (String[] args) {
int N = 5 ;
int A[] = { 5 , 5 , 5 , 5 , 5 };
Vector<Integer> ans = findIndices(N, A);
for ( int i = 0 ; i < ans.size(); i++) {
System.out.print(ans.get(i) + " " );
}
}
}
|
Python3
def findIndices(N, A):
answer = []
sum = 0
for i in range ( 0 , N):
sum + = A[i]
for i in range ( 0 , N):
curr_sum = sum - A[i]
if (curr_sum % (N - 1 ) = = 0 and curr_sum / / (N - 1 ) = = A[i]):
answer.append(i)
return answer
N = 5
A = [ 5 , 5 , 5 , 5 , 5 ]
ans = findIndices(N, A)
print ( * ans)
|
C#
using System;
using System.Collections;
class GFG {
static ArrayList findIndices( int N, int [] A)
{
ArrayList answer = new ArrayList();
int sum = 0;
for ( int i = 0; i < N; i++) {
sum += A[i];
}
for ( int i = 0; i < N; i++) {
int curr_sum = sum - A[i];
if (curr_sum % (N - 1) == 0
&& curr_sum / (N - 1) == A[i]) {
answer.Add(i);
}
}
return answer;
}
public static void Main()
{
int N = 5;
int [] A = { 5, 5, 5, 5, 5 };
ArrayList ans = findIndices(N, A);
for ( int i = 0; i < ans.Count; i++) {
Console.Write(ans[i] + " " );
}
}
}
|
Javascript
function findIndices(N, A) {
let answer = [];
let sum = 0;
for (let i = 0; i < N; i++) {
sum += A[i];
}
for (let i = 0; i < N; i++) {
let curr_sum = sum - A[i];
if (curr_sum % (N - 1) == 0
&& curr_sum / (N - 1) == A[i]) {
answer.push(i);
}
}
return answer;
}
let N = 5;
let A = [5, 5, 5, 5, 5];
let ans = findIndices(N, A);
for (let i = 0; i < ans.length; i++) {
document.write(ans[i] + " " )
}
|
Time Complexity: O(N)
Auxiliary Space: O(N)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...