Difference between maximum and minimum average of all K-length contiguous subarrays
Last Updated :
24 Jan, 2022
Given an array arr[] of size N and an integer K, the task is to print the difference between the maximum and minimum average of the contiguous subarrays of length K.
Examples:
Input: arr[ ] = {3, 8, 9, 15}, K = 2
Output: 6.5
Explanation:
All subarrays of length 2 are {3, 8}, {8, 9}, {9, 15} and their averages are (3+8)/2 = 5.5, (8+9)/2 = 8.5, and (9+15)/2 = 12.0 respectively.
Therefore, the difference between the maximum(=12.0) and minimum(=5.5) is 12.0 -5.5 = 6.5.
Input: arr[] = {17, 6.2, 19, 3.4}, K = 3
Output: 4.533
Naive Approach: The simplest approach is to find the average of every contiguous subarray of size K, and then find the maximum and minimum of these values, and print their difference.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
double Avgdifference( double arr[], int N, int K)
{
double min = 1000000, max = -1;
for ( int i = 0; i <= N - K; i++) {
double sum = 0;
for ( int j = 0; j < K; j++) {
sum += arr[i + j];
}
if (min > sum)
min = sum;
if (max < sum)
max = sum;
}
return (max - min) / K;
}
int main()
{
double arr[] = { 3, 8, 9, 15 };
int N = sizeof (arr) / sizeof (arr[0]);
int K = 2;
cout << Avgdifference(arr, N, K);
return 0;
}
|
Java
import java.io.*;
class GFG
{
static double Avgdifference( double arr[], int N, int K)
{
double min = 1000000 , max = - 1 ;
for ( int i = 0 ; i <= N - K; i++) {
double sum = 0 ;
for ( int j = 0 ; j < K; j++) {
sum += arr[i + j];
}
if (min > sum)
min = sum;
if (max < sum)
max = sum;
}
return (max - min) / K;
}
public static void main (String[] args)
{
double arr[] = { 3 , 8 , 9 , 15 };
int N =arr.length;
int K = 2 ;
System.out.println( Avgdifference(arr, N, K));
}
}
|
Python3
def Avgdifference(arr, N, K):
min = 1000000 ;
max = - 1 ;
for i in range (N - K + 1 ):
sum = 0 ;
for j in range (K):
sum + = arr[i + j];
if ( min > sum ):
min = sum ;
if ( max < sum ):
max = sum ;
return ( max - min ) / K;
arr = [ 3 , 8 , 9 , 15 ];
N = len (arr);
K = 2 ;
print (Avgdifference(arr, N, K));
|
C#
using System;
class GFG{
static double Avgdifference( double []arr, int N, int K)
{
double min = 1000000, max = -1;
for ( int i = 0; i <= N - K; i++)
{
double sum = 0;
for ( int j = 0; j < K; j++)
{
sum += arr[i + j];
}
if (min > sum)
min = sum;
if (max < sum)
max = sum;
}
return (max - min) / K;
}
public static void Main (String[] args)
{
double []arr = { 3, 8, 9, 15 };
int N = arr.Length;
int K = 2;
Console.Write(Avgdifference(arr, N, K));
}
}
|
Javascript
<script>
function Avgdifference(arr, N, K) {
let min = 1000000, max = -1;
for (let i = 0; i <= N - K; i++) {
let sum = 0;
for (let j = 0; j < K; j++) {
sum += arr[i + j];
}
if (min > sum)
min = sum;
if (max < sum)
max = sum;
}
return (max - min) / K;
}
let arr = [3, 8, 9, 15];
let N = arr.length;
let K = 2;
document.write(Avgdifference(arr, N, K));
</script>
|
Time Complexity: O(N*K)
Auxiliary Space: O(1)
Efficient Approach: The above approach can be optimized using the sliding window technique. Follow the steps below to solve the problem:
- Find the sum of subarrays over the range [0, K-1] and store it in a variable say sum.
- Initialize two variables, say max and min, to store the maximum and minimum sum of any subarray of size K.
- Iterate over the range [K, N-K+1] using the variable i and perform the following steps:
- Remove the element arr[i-K] and add the element arr[i] to the windows of size K. i.e Update sum to sum+arr[i]-arr[i-K].
- Update the min as the minimum of min and sum, and update max as the maximum of max and sum.
- Finally, after completing the above steps, print the answer as (max-min)/K.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
double Avgdifference( double arr[], int N, int K)
{
double sum = 0;
for ( int i = 0; i < K; i++)
sum += arr[i];
double min = sum;
double max = sum;
for ( int i = K; i <= N - K + 1; i++) {
sum += arr[i] - arr[i - K];
if (min > sum)
min = sum;
if (max < sum)
max = sum;
}
return (max - min) / K;
}
int main()
{
double arr[] = { 3, 8, 9, 15 };
int N = sizeof (arr) / sizeof (arr[0]);
int K = 2;
cout << Avgdifference(arr, N, K);
return 0;
}
|
Java
import java.io.*;
class GFG{
static double Avgdifference( double arr[], int N, int K)
{
double sum = 0 ;
for ( int i = 0 ; i < K; i++)
sum += arr[i];
double min = sum;
double max = sum;
for ( int i = K; i <= N - K + 1 ; i++)
{
sum += arr[i] - arr[i - K];
if (min > sum)
min = sum;
if (max < sum)
max = sum;
}
return (max - min) / K;
}
public static void main (String[] args)
{
double arr[] = { 3 , 8 , 9 , 15 };
int N = arr.length;
int K = 2 ;
System.out.println(Avgdifference(arr, N, K));
}
}
|
Python3
def Avgdifference(arr, N, K):
sum = 0
for i in range (K):
sum + = arr[i]
min = sum
max = sum
for i in range (K,N - K + 2 , 1 ):
sum + = arr[i] - arr[i - K]
if ( min > sum ):
min = sum
if ( max < sum ):
max = sum
return ( max - min ) / K
if __name__ = = '__main__' :
arr = [ 3 , 8 , 9 , 15 ]
N = len (arr)
K = 2
print (Avgdifference(arr, N, K))
|
C#
using System;
class GFG{
static double Avgdifference( double []arr, int N, int K)
{
double sum = 0;
for ( int i = 0; i < K; i++)
sum += arr[i];
double min = sum;
double max = sum;
for ( int i = K; i <= N - K + 1; i++)
{
sum += arr[i] - arr[i - K];
if (min > sum)
min = sum;
if (max < sum)
max = sum;
}
return (max - min) / K;
}
public static void Main (String[] args)
{
double []arr = { 3, 8, 9, 15 };
int N = arr.Length;
int K = 2;
Console.Write(Avgdifference(arr, N, K));
}
}
|
Javascript
<script>
function Avgdifference(arr, N, K)
{
let sum = 0;
for (let i = 0; i < K; i++)
sum += arr[i];
let min = sum;
let max = sum;
for (let i = K; i <= N - K + 1; i++)
{
sum += arr[i] - arr[i - K];
if (min > sum)
min = sum;
if (max < sum)
max = sum;
}
return (max - min) / K;
}
let arr = [ 3, 8, 9, 15 ];
let N = arr.length;
let K = 2;
document.write(Avgdifference(arr, N, K));
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(1)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...