Find the subarray with least average
Last Updated :
16 Jul, 2022
Given an array arr[] of size n and integer k such that k <= n.
Examples :
Input: arr[] = {3, 7, 90, 20, 10, 50, 40}, k = 3
Output: Subarray between indexes 3 and 5
The subarray {20, 10, 50} has the least average
among all subarrays of size 3.
Input: arr[] = {3, 7, 5, 20, -10, 0, 12}, k = 2
Output: Subarray between [4, 5] has minimum average
A Simple Solution is to consider every element as beginning of subarray of size k and compute sum of subarray starting with this element. Time complexity of this solution is O(nk).
Java
import java.util.*;
class GFG {
static void findsubarrayleast( int arr[], int k, int n)
{
int min = Integer.MAX_VALUE;
int minindex = 0 ;
for ( int i = 0 ; i <= n - k; i++) {
int sum = 0 ;
for ( int j = i; j < i + k; j++) {
sum += arr[j];
}
if (sum < min) {
min = sum;
minindex = i;
}
}
System.out.println(
"subarray with minimum average is: " );
for ( int i = minindex; i < minindex + k; i++) {
System.out.print(arr[i] + " " );
}
}
public static void main(String[] args)
{
int arr[] = { 20 , 3 , 13 , 5 , 10 , 14 , 8 , 5 , 11 , 9 , 1 , 11 };
int n = arr.length;
int k = 9 ;
findsubarrayleast(arr, k, n);
}
}
|
C++
#include<bits/stdc++.h>
using namespace std;
void findsubarrayleast( int arr[], int k, int n){
int min=INT_MAX,minindex;
for ( int i = 0; i <= n-k; i++)
{
int sum=0;
for ( int j = i; j < i+k; j++)
{
sum+=arr[j];
}
if (sum<min){
min=sum;
minindex=i;
}
}
cout<< "subarray with minimum average is: " ;
for ( int i = minindex; i < minindex+k; i++)
{
cout<<arr[i]<< " " ;
}
}
int main() {
int arr[]={3, 7, 90, 20, 10, 50, 40};
int n= sizeof (arr)/ sizeof (arr[0]),k=3;
findsubarrayleast(arr,k,n);
return 0;
}
|
Python3
def findsubarrayleast(arr, k, n):
min = 999999
minindex = 0
for i in range (n - k + 1 ):
sum = 0
j = i
for j in range (i, i + k):
sum + = arr[j]
if sum < min :
min = sum
minindex = i
print ( "subarray with minimum average is: " , end = '')
for i in range (minindex, minindex + k):
print (arr[i], end = " " )
arr = [ 20 , 3 , 13 , 5 , 10 , 14 , 8 , 5 , 11 , 9 , 1 , 11 ]
k = 9
n = len (arr)
findsubarrayleast(arr, k, n)
|
C#
using System;
class GFG {
static void findsubarrayleast( int []arr, int k, int n){
int min = Int32.MaxValue;
int minindex = 0;
for ( int i = 0; i <= n-k; i++)
{
int sum = 0;
for ( int j = i; j < i+k; j++)
{
sum += arr[j];
}
if (sum < min){
min = sum;
minindex = i;
}
}
Console.Write( "subarray with minimum average is: " );
for ( int i = minindex; i < minindex+k; i++)
{
Console.Write(arr[i]+ " " );
}
}
static public void Main()
{
int [] arr = { 3, 7, 90, 20, 10, 50, 40};
int n = arr.Length;
int k=3;
findsubarrayleast(arr,k,n);
}
}
|
Javascript
function findsubarrayleast(arr, k, n)
{
var min = Number.MAX_VALUE;
var minindex = 0;
for ( var i = 0; i < n - k; i++)
{
var sum = 0;
for ( var j=i; j < i + k; j++)
{
sum += arr[j];
}
if (sum < min)
{
min = sum;
minindex = i;
}
}
console.log( "subarray with minimum average is: " );
for ( var i=minindex; i < minindex + k; i++)
{
console.log(arr[i] + " " );
}
}
var arr = [3, 7, 90, 20, 10, 50, 40];
var n = arr.length;
var k = 3;
findsubarrayleast(arr, k, n);
|
Output
subarray with minimum average is: 20 10 50
Time Complexity: O(n*k) where n is the size of array.
Auxiliary Space: O(1)
An Efficient Solution is to solve the above problem in O(n) time and O(1) extra space. The idea is to use sliding window of size k. Keep track of sum of current k elements. To compute sum of current window, remove first element of previous window and add current element (last element of current window).
1) Initialize res_index = 0 // Beginning of result index
2) Find sum of first k elements. Let this sum be 'curr_sum'
3) Initialize min_sum = sum
4) Iterate from (k+1)'th to n'th element, do following
for every element arr[i]
a) curr_sum = curr_sum + arr[i] - arr[i-k]
b) If curr_sum < min_sum
res_index = (i-k+1)
5) Print res_index and res_index+k-1 as beginning and ending
indexes of resultant subarray.
Below is the implementation of above algorithm.
C++
#include <bits/stdc++.h>
using namespace std;
void findMinAvgSubarray( int arr[], int n, int k)
{
if (n < k)
return ;
int res_index = 0;
int curr_sum = 0;
for ( int i = 0; i < k; i++)
curr_sum += arr[i];
int min_sum = curr_sum;
for ( int i = k; i < n; i++) {
curr_sum += arr[i] - arr[i - k];
if (curr_sum < min_sum) {
min_sum = curr_sum;
res_index = (i - k + 1);
}
}
cout << "Subarray between [" << res_index << ", "
<< res_index + k - 1 << "] has minimum average" ;
}
int main()
{
int arr[] = { 3, 7, 90, 20, 10, 50, 40 };
int k = 3;
int n = sizeof arr / sizeof arr[0];
findMinAvgSubarray(arr, n, k);
return 0;
}
|
Java
class Test {
static int arr[] = new int [] { 3 , 7 , 90 , 20 , 10 , 50 , 40 };
static void findMinAvgSubarray( int n, int k)
{
if (n < k)
return ;
int res_index = 0 ;
int curr_sum = 0 ;
for ( int i = 0 ; i < k; i++)
curr_sum += arr[i];
int min_sum = curr_sum;
for ( int i = k; i < n; i++)
{
curr_sum += arr[i] - arr[i - k];
if (curr_sum < min_sum) {
min_sum = curr_sum;
res_index = (i - k + 1 );
}
}
System.out.println( "Subarray between [" +
res_index + ", " + (res_index + k - 1 ) +
"] has minimum average" );
}
public static void main(String[] args)
{
int k = 3 ;
findMinAvgSubarray(arr.length, k);
}
}
|
Python3
def findMinAvgSubarray(arr, n, k):
if (n < k): return 0
res_index = 0
curr_sum = 0
for i in range (k):
curr_sum + = arr[i]
min_sum = curr_sum
for i in range (k, n):
curr_sum + = arr[i] - arr[i - k]
if (curr_sum < min_sum):
min_sum = curr_sum
res_index = (i - k + 1 )
print ( "Subarray between [" , res_index,
", " , (res_index + k - 1 ),
"] has minimum average" )
arr = [ 3 , 7 , 90 , 20 , 10 , 50 , 40 ]
k = 3
n = len (arr)
findMinAvgSubarray(arr, n, k)
|
C#
using System;
class Test {
static int [] arr = new int [] { 3, 7, 90, 20, 10, 50, 40 };
static void findMinAvgSubarray( int n, int k)
{
if (n < k)
return ;
int res_index = 0;
int curr_sum = 0;
for ( int i = 0; i < k; i++)
curr_sum += arr[i];
int min_sum = curr_sum;
for ( int i = k; i < n; i++)
{
curr_sum += arr[i] - arr[i - k];
if (curr_sum < min_sum) {
min_sum = curr_sum;
res_index = (i - k + 1);
}
}
Console.Write( "Subarray between [" + res_index + ", " +
(res_index + k - 1) +
"] has minimum average" );
}
public static void Main()
{
int k = 3;
findMinAvgSubarray(arr.Length, k);
}
}
|
PHP
<?php
function findMinAvgSubarray( $arr , $n , $k )
{
if ( $n < $k )
return ;
$res_index = 0;
$curr_sum = 0;
for ( $i = 0; $i < $k ; $i ++)
$curr_sum += $arr [ $i ];
$min_sum = $curr_sum ;
for ( $i = $k ; $i < $n ; $i ++)
{
$curr_sum += $arr [ $i ] - $arr [ $i - $k ];
if ( $curr_sum < $min_sum ) {
$min_sum = $curr_sum ;
$res_index = ( $i - $k + 1);
}
}
echo "Subarray between [" , $res_index
, ", " , $res_index + $k - 1, "] has minimum average" ;
}
$arr = array (3, 7, 90, 20, 10, 50, 40);
$k = 3;
$n = sizeof ( $arr ) / sizeof ( $arr [0]);
findMinAvgSubarray( $arr , $n , $k );
return 0;
?>
|
Javascript
<script>
function findMinAvgSubarray(arr, n, k)
{
if (n < k)
return ;
let res_index = 0;
let curr_sum = 0;
for (let i = 0; i < k; i++)
curr_sum += arr[i];
let min_sum = curr_sum;
for (let i = k; i < n; i++)
{
curr_sum += arr[i] - arr[i - k];
if (curr_sum < min_sum)
{
min_sum = curr_sum;
res_index = (i - k + 1);
}
}
document.write( "Subarray between [" + res_index +
", " + (res_index + k - 1) +
"] has minimum average" );
}
let arr = [ 3, 7, 90, 20, 10, 50, 40 ];
let k = 3;
let n = arr.length;
findMinAvgSubarray(arr, n, k);
</script>
|
Output
Subarray between [3, 5] has minimum average
Time Complexity: O(n)
Auxiliary Space: O(1)
Share your thoughts in the comments
Please Login to comment...