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#
using System;
public class GFG {
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(( double )sum / count);
return mean;
}
public static void Main()
{
int []arr = { 1, 2, 3, 4, 5 };
Console.WriteLine(findMean(arr, 0, 2));
Console.WriteLine(findMean(arr, 1, 3));
Console.WriteLine(findMean(arr, 0, 4));
}
}
|
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++
#include <bits/stdc++.h>
#define MAX 1000005
using namespace std;
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);
cout << findMean(0, 2) << endl;
cout << findMean(1, 3) << endl;
cout << findMean(0, 4) << endl;
return 0;
}
|
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.
This article is contributed by nuclode. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.