Python3 Program for Mean of range in array
Given an array of n integers. You are given q queries. Write a program to print the 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.
Python3
# Python 3 program to find floor value # of mean in range l to r import math # To find mean of range in l to r def findMean(arr, l, r): # Both sum and count are # initialize to 0 sum , count = 0 , 0 # To calculate sum and number # of elements in range l to r for i in range (l, r + 1 ): sum + = arr[i] count + = 1 # Calculate floor value of mean mean = math.floor( sum / count) # Returns mean of array # in range l to r return mean # Driver Code arr = [ 1 , 2 , 3 , 4 , 5 ] print (findMean(arr, 0 , 2 )) print (findMean(arr, 1 , 3 )) print (findMean(arr, 0 , 4 )) # This code is contributed # by PrinciRaj1992 |
Output :
2 3 3
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 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).
Python3
# Python3 program to find floor value # of mean in range l to r import math as mt MAX = 1000005 prefixSum = [ 0 for i in range ( MAX )] # To calculate prefixSum of array def calculatePrefixSum(arr, n): # Calculate prefix sum of array prefixSum[ 0 ] = arr[ 0 ] for i in range ( 1 ,n): prefixSum[i] = prefixSum[i - 1 ] + arr[i] # To return floor of mean # in range l to r def findMean(l, r): if (l = = 0 ): return mt.floor(prefixSum[r] / (r + 1 )) # Sum of elements in range l to # r is prefixSum[r] - prefixSum[l-1] # Number of elements in range # l to r is r - l + 1 return (mt.floor((prefixSum[r] - prefixSum[l - 1 ]) / (r - l + 1 ))) # Driver Code arr = [ 1 , 2 , 3 , 4 , 5 ] n = len (arr) calculatePrefixSum(arr, n) print (findMean( 0 , 2 )) print (findMean( 1 , 3 )) print (findMean( 0 , 4 )) # This code is contributed by Mohit Kumar |
Output:
2 3 3
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.
Please refer complete article on Mean of range in array for more details!
Please Login to comment...