Mean of range in array
Last Updated :
09 Dec, 2022
Given an array of n integers. You are given q queries. Write a program to print floor value of mean in range l to r for each query in a new line.
Examples :
Input : arr[] = {1, 2, 3, 4, 5}
q = 3
0 2
1 3
0 4
Output : 2
3
3
Here for 0 to 2 (1 + 2 + 3) / 3 = 2
Input : arr[] = {6, 7, 8, 10}
q = 2
0 3
1 2
Output : 7
7
Naive Approach: We can run loop for each query l to r and find sum and number of elements in range. After this we can print floor of mean for each query.
C++
#include <bits/stdc++.h>
using namespace std;
int findMean( int arr[], int l, int r)
{
int sum = 0, count = 0;
for ( int i = l; i <= r; i++) {
sum += arr[i];
count++;
}
int mean = floor (sum / count);
return mean;
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5 };
cout << findMean(arr, 0, 2) << endl;
cout << findMean(arr, 1, 3) << endl;
cout << findMean(arr, 0, 4) << endl;
return 0;
}
|
C
#include <stdio.h>
#include <math.h>
int findMean( int arr[], int l, int r)
{
int sum = 0, count = 0;
for ( int i = l; i <= r; i++) {
sum += arr[i];
count++;
}
int mean = floor (sum / count);
return mean;
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5 };
printf ( "%d\n" ,findMean(arr, 0, 2));
printf ( "%d\n" ,findMean(arr, 1, 3));
printf ( "%d\n" ,findMean(arr, 0, 4));
return 0;
}
|
Java
import java.io.*;
public class Main {
static int findMean( int arr[], int l, int r)
{
int sum = 0 , count = 0 ;
for ( int i = l; i <= r; i++) {
sum += arr[i];
count++;
}
int mean = ( int )Math.floor(sum / count);
return mean;
}
public static void main(String[] args)
{
int arr[] = { 1 , 2 , 3 , 4 , 5 };
System.out.println(findMean(arr, 0 , 2 ));
System.out.println(findMean(arr, 1 , 3 ));
System.out.println(findMean(arr, 0 , 4 ));
}
}
|
Python3
import math
def findMean(arr, l, r):
sum , count = 0 , 0
for i in range (l, r + 1 ):
sum + = arr[i]
count + = 1
mean = math.floor( sum / count)
return mean
arr = [ 1 , 2 , 3 , 4 , 5 ]
print (findMean(arr, 0 , 2 ))
print (findMean(arr, 1 , 3 ))
print (findMean(arr, 0 , 4 ))
|
C#
<div id= "highlighter_465727" class = "syntaxhighlighter nogutter " ><table border= "0" cellpadding= "0" cellspacing= "0" ><tbody><tr><td class = "code" ><div class = "container" ><div class = "line number1 index0 alt2" ><code class = "comments" >
|
PHP
<?php
function findMean( $arr , $l , $r )
{
$sum = 0;
$count = 0;
for ( $i = $l ; $i <= $r ; $i ++)
{
$sum += $arr [ $i ];
$count ++;
}
$mean = floor ( $sum / $count );
return $mean ;
}
$arr = array (1, 2, 3, 4, 5);
echo findMean( $arr , 0, 2), "\n" ;
echo findMean( $arr , 1, 3), "\n" ;
echo findMean( $arr , 0, 4), "\n" ;
?>
|
Javascript
<script>
function findMean(arr, l, r)
{
let sum = 0, count = 0;
for (let i = l; i <= r; i++) {
sum += arr[i];
count++;
}
let mean = Math.floor(sum / count);
return mean;
}
let arr = [ 1, 2, 3, 4, 5 ];
document.write(findMean(arr, 0, 2) + "</br>" );
document.write(findMean(arr, 1, 3) + "</br>" );
document.write(findMean(arr, 0, 4) + "</br>" );
</script>
|
Time complexity: O(n*q) where q is the number of queries and n is the size of the array. Here in the above code q is 3 as the findMean function is used 3 times.
Auxiliary Space: O(1)
Efficient Approach: We can find sum of numbers using prefix sum. The prefixSum[i] denotes the sum of first i elements. So sum of numbers in range l to r will be prefixSum[r] – prefixSum[l-1]. Number of elements in range l to r will be r – l + 1. So we can now print mean of range l to r in O(1).
C++
Java
import java.io.*;
public class Main {
public static final int MAX = 1000005 ;
static int prefixSum[] = new int [MAX];
static void calculatePrefixSum( int arr[], int n)
{
prefixSum[ 0 ] = arr[ 0 ];
for ( int i = 1 ; i < n; i++)
prefixSum[i] = prefixSum[i - 1 ] + arr[i];
}
static int findMean( int l, int r)
{
if (l == 0 )
return ( int )Math.floor(prefixSum[r] / (r + 1 ));
return ( int )Math.floor((prefixSum[r] -
prefixSum[l - 1 ]) / (r - l + 1 ));
}
public static void main(String[] args)
{
int arr[] = { 1 , 2 , 3 , 4 , 5 };
int n = arr.length;
calculatePrefixSum(arr, n);
System.out.println(findMean( 1 , 2 ));
System.out.println(findMean( 1 , 3 ));
System.out.println(findMean( 1 , 4 ));
}
}
|
Python3
import math as mt
MAX = 1000005
prefixSum = [ 0 for i in range ( MAX )]
def calculatePrefixSum(arr, n):
prefixSum[ 0 ] = arr[ 0 ]
for i in range ( 1 ,n):
prefixSum[i] = prefixSum[i - 1 ] + arr[i]
def findMean(l, r):
if (l = = 0 ):
return mt.floor(prefixSum[r] / (r + 1 ))
return (mt.floor((prefixSum[r] -
prefixSum[l - 1 ]) /
(r - l + 1 )))
arr = [ 1 , 2 , 3 , 4 , 5 ]
n = len (arr)
calculatePrefixSum(arr, n)
print (findMean( 0 , 2 ))
print (findMean( 1 , 3 ))
print (findMean( 0 , 4 ))
|
C#
using System;
public class GFG {
public static readonly int MAX = 1000005;
static int []prefixSum = new int [MAX];
static void calculatePrefixSum( int []arr, int n)
{
prefixSum[0] = arr[0];
for ( int i = 1; i < n; i++)
prefixSum[i] = prefixSum[i - 1] + arr[i];
}
static int findMean( int l, int r)
{
if (l == 0)
return ( int )Math.Floor(( double )(prefixSum[r] / (r + 1)));
return ( int )Math.Floor(( double )(prefixSum[r] -
prefixSum[l - 1]) / (r - l + 1));
}
public static void Main()
{
int []arr = { 1, 2, 3, 4, 5 };
int n = arr.Length;
calculatePrefixSum(arr, n);
Console.WriteLine(findMean(1, 2));
Console.WriteLine(findMean(1, 3));
Console.WriteLine(findMean(1, 4));
}
}
|
Javascript
<script>
let MAX = 1000005;
let prefixSum = new Array(MAX);
prefixSum.fill(0);
function calculatePrefixSum(arr, n)
{
prefixSum[0] = arr[0];
for (let i = 1; i < n; i++)
prefixSum[i] = prefixSum[i - 1] + arr[i];
}
function findMean(l, r)
{
if (l == 0)
return parseInt(Math.floor(prefixSum[r] /
(r + 1)), 10);
return parseInt(Math.floor((prefixSum[r] -
prefixSum[l - 1]) /
(r - l + 1)), 10);
}
let arr = [ 1, 2, 3, 4, 5 ];
let n = arr.length;
calculatePrefixSum(arr, n);
document.write(findMean(1, 2) + "</br>" );
document.write(findMean(1, 3) + "</br>" );
document.write(findMean(1, 4) + "</br>" );
</script>
|
C
#include <stdio.h>
#include <math.h>
#define MAX 1000005
int prefixSum[MAX];
void calculatePrefixSum( int arr[], int n)
{
prefixSum[0] = arr[0];
for ( int i = 1; i < n; i++)
prefixSum[i] = prefixSum[i - 1] + arr[i];
}
int findMean( int l, int r)
{
if (l == 0)
return floor (prefixSum[r]/(r+1));
return floor ((prefixSum[r] -
prefixSum[l - 1]) / (r - l + 1));
}
int main()
{
int arr[] = { 1, 2, 3, 4, 5 };
int n = sizeof (arr) / sizeof (arr[0]);
calculatePrefixSum(arr, n);
printf ( "%d\n" ,findMean(0, 2));
printf ( "%d\n" ,findMean(1, 3));
printf ( "%d\n" ,findMean(0, 4));
return 0;
}
|
Time complexity: O(n+q) where q is the number of queries and n is the size of the array. Here in the above code q is 3 as the findMean function is used 3 times.
Auxiliary Space: O(k) where k=1000005.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...