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
// java program code of Naive approach to
// find subarray with minimum average
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;
}
}
// printing the desired subarray
System.out.println(
"subarray with minimum average is: ");
for (int i = minindex; i < minindex + k; i++) {
System.out.print(arr[i] + " ");
}
}
// Driver Code
public static void main(String[] args)
{
// Test Case 1
int arr[] = {20, 3, 13, 5, 10, 14, 8, 5, 11, 9, 1, 11};
int n = arr.length;
int k = 9;
// function call
findsubarrayleast(arr, k, n);
}
}
// This code is contributed by Aarti_Rathi
C++
//C++ code of Naive approach to
//find subarray with minimum average
#include<bits/stdc++.h>
using namespace std;
//function to find subarray
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;
}
}
//printing the desired subarray
cout<<"subarray with minimum average is: ";
for (int i = minindex; i < minindex+k; i++)
{
cout<<arr[i]<<" ";
}
}
//driver code
int main() {
int arr[]={3, 7, 90, 20, 10, 50, 40};
int n=sizeof(arr)/sizeof(arr[0]),k=3;
//function call
findsubarrayleast(arr,k,n);
return 0;
}
//this code is contributed by Machhaliya Muhammad
Python3
# Python3 program to find
# minimum average subarray
# Prints beginning and ending
# indexes of subarray of size k
# with minimum average
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
# printing the desired subarray
print("subarray with minimum average is: ", end='')
for i in range(minindex, minindex+k):
print(arr[i], end=" ")
# Driver Code
arr = [20, 3, 13, 5, 10, 14, 8, 5, 11, 9, 1, 11]
k = 9 # Subarray size
n = len(arr)
findsubarrayleast(arr, k, n)
# This code is contributed by Aarti_Rathi
C#
// C# program code of Naive approach to
//find subarray with minimum average
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;
}
}
//printing the desired subarray
Console.Write("subarray with minimum average is: ");
for (int i = minindex; i < minindex+k; i++)
{
Console.Write(arr[i]+" ");
}
}
// Driver Code
static public void Main()
{
// Test Case 1
int[] arr = { 3, 7, 90, 20, 10, 50, 40};
int n = arr.Length;
int k=3;
// function call
findsubarrayleast(arr,k,n);
}
}
// This code is contributed by Aarti_Rathi
JavaScript
// javascript program code of Naive approach to
// find subarray with minimum average
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;
}
}
// printing the desired subarray
console.log("subarray with minimum average is: ");
for (var i=minindex; i < minindex + k; i++)
{
console.log(arr[i] + " ");
}
}
// Driver Code
var arr = [3, 7, 90, 20, 10, 50, 40];
var n = arr.length;
var k = 3;
// function call
findsubarrayleast(arr, k, n);
// This code is contributed by Aarti_Rathi
Outputsubarray 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++
// A Simple C++ program to find minimum average subarray
#include <bits/stdc++.h>
using namespace std;
// Prints beginning and ending indexes of subarray
// of size k with minimum average
void findMinAvgSubarray(int arr[], int n, int k)
{
// k must be smaller than or equal to n
if (n < k)
return;
// Initialize beginning index of result
int res_index = 0;
// Compute sum of first subarray of size k
int curr_sum = 0;
for (int i = 0; i < k; i++)
curr_sum += arr[i];
// Initialize minimum sum as current sum
int min_sum = curr_sum;
// Traverse from (k+1)'th element to n'th element
for (int i = k; i < n; i++) {
// Add current item and remove first item of
// previous subarray
curr_sum += arr[i] - arr[i - k];
// Update result if needed
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";
}
// Driver program
int main()
{
int arr[] = { 3, 7, 90, 20, 10, 50, 40 };
int k = 3; // Subarray size
int n = sizeof arr / sizeof arr[0];
findMinAvgSubarray(arr, n, k);
return 0;
}
Java
// A Simple Java program to find
// minimum average subarray
class Test {
static int arr[] = new int[] { 3, 7, 90, 20, 10, 50, 40 };
// Prints beginning and ending indexes of subarray
// of size k with minimum average
static void findMinAvgSubarray(int n, int k)
{
// k must be smaller than or equal to n
if (n < k)
return;
// Initialize beginning index of result
int res_index = 0;
// Compute sum of first subarray of size k
int curr_sum = 0;
for (int i = 0; i < k; i++)
curr_sum += arr[i];
// Initialize minimum sum as current sum
int min_sum = curr_sum;
// Traverse from (k+1)'th element to n'th element
for (int i = k; i < n; i++)
{
// Add current item and remove first
// item of previous subarray
curr_sum += arr[i] - arr[i - k];
// Update result if needed
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");
}
// Driver method to test the above function
public static void main(String[] args)
{
int k = 3; // Subarray size
findMinAvgSubarray(arr.length, k);
}
}
Python3
# Python3 program to find
# minimum average subarray
# Prints beginning and ending
# indexes of subarray of size k
# with minimum average
def findMinAvgSubarray(arr, n, k):
# k must be smaller than or equal to n
if (n < k): return 0
# Initialize beginning index of result
res_index = 0
# Compute sum of first subarray of size k
curr_sum = 0
for i in range(k):
curr_sum += arr[i]
# Initialize minimum sum as current sum
min_sum = curr_sum
# Traverse from (k + 1)'th
# element to n'th element
for i in range(k, n):
# Add current item and remove first
# item of previous subarray
curr_sum += arr[i] - arr[i-k]
# Update result if needed
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")
# Driver Code
arr = [3, 7, 90, 20, 10, 50, 40]
k = 3 # Subarray size
n = len(arr)
findMinAvgSubarray(arr, n, k)
# This code is contributed by Anant Agarwal.
C#
// A Simple C# program to find
// minimum average subarray
using System;
class Test {
static int[] arr = new int[] { 3, 7, 90, 20, 10, 50, 40 };
// Prints beginning and ending indexes of subarray
// of size k with minimum average
static void findMinAvgSubarray(int n, int k)
{
// k must be smaller than or equal to n
if (n < k)
return;
// Initialize beginning index of result
int res_index = 0;
// Compute sum of first subarray of size k
int curr_sum = 0;
for (int i = 0; i < k; i++)
curr_sum += arr[i];
// Initialize minimum sum as current sum
int min_sum = curr_sum;
// Traverse from (k+1)'th element to n'th element
for (int i = k; i < n; i++)
{
// Add current item and remove first item of
// previous subarray
curr_sum += arr[i] - arr[i - k];
// Update result if needed
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");
}
// Driver method to test the above function
public static void Main()
{
int k = 3; // Subarray size
findMinAvgSubarray(arr.Length, k);
}
}
// This code is contributed by nitin mittal.
PHP
<?php
// A Simple PHP program to find
// minimum average subarray
// Prints beginning and ending
// indexes of subarray of size
// k with minimum average
function findMinAvgSubarray($arr, $n, $k)
{
// k must be smaller
// than or equal to n
if ($n < $k)
return;
// Initialize beginning
// index of result
$res_index = 0;
// Compute sum of first
// subarray of size k
$curr_sum = 0;
for ($i = 0; $i < $k; $i++)
$curr_sum += $arr[$i];
// Initialize minimum sum
// as current sum
$min_sum = $curr_sum;
// Traverse from (k+1)'th element
// to n'th element
for ( $i = $k; $i < $n; $i++)
{
// Add current item and
// remove first item of
// previous subarray
$curr_sum += $arr[$i] - $arr[$i - $k];
// Update result if needed
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";
}
// Driver Code
$arr = array(3, 7, 90, 20, 10, 50, 40);
// Subarray size
$k = 3;
$n = sizeof ($arr) / sizeof ($arr[0]);
findMinAvgSubarray($arr, $n, $k);
return 0;
// This code is contributed by nitin mittal.
?>
JavaScript
<script>
// A Simple JavaScript program to find
// minimum average subarray
// Prints beginning and ending indexes
// of subarray of size k with minimum average
function findMinAvgSubarray(arr, n, k)
{
// k must be smaller than or equal to n
if (n < k)
return;
// Initialize beginning index of result
let res_index = 0;
// Compute sum of first subarray of size k
let curr_sum = 0;
for(let i = 0; i < k; i++)
curr_sum += arr[i];
// Initialize minimum sum as current sum
let min_sum = curr_sum;
// Traverse from (k+1)'th element
// to n'th element
for(let i = k; i < n; i++)
{
// Add current item and remove first
// item of previous subarray
curr_sum += arr[i] - arr[i - k];
// Update result if needed
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");
}
// Driver code
let arr = [ 3, 7, 90, 20, 10, 50, 40 ];
// Subarray size
let k = 3;
let n = arr.length;
findMinAvgSubarray(arr, n, k);
// This code is contributed by Surbhi Tyagi.
</script>
OutputSubarray between [3, 5] has minimum average
Time Complexity: O(n)
Auxiliary Space: O(1)
Similar Reads
DSA Tutorial - Learn Data Structures and Algorithms DSA (Data Structures and Algorithms) is the study of organizing data efficiently using data structures like arrays, stacks, and trees, paired with step-by-step procedures (or algorithms) to solve problems effectively. Data structures manage how data is stored and accessed, while algorithms focus on
7 min read
Quick Sort QuickSort is a sorting algorithm based on the Divide and Conquer that picks an element as a pivot and partitions the given array around the picked pivot by placing the pivot in its correct position in the sorted array. It works on the principle of divide and conquer, breaking down the problem into s
12 min read
Merge Sort - Data Structure and Algorithms Tutorials Merge sort is a popular sorting algorithm known for its efficiency and stability. It follows the divide-and-conquer approach. It works by recursively dividing the input array into two halves, recursively sorting the two halves and finally merging them back together to obtain the sorted array. Merge
14 min read
Data Structures Tutorial Data structures are the fundamental building blocks of computer programming. They define how data is organized, stored, and manipulated within a program. Understanding data structures is very important for developing efficient and effective algorithms. What is Data Structure?A data structure is a st
2 min read
Bubble Sort Algorithm Bubble Sort is the simplest sorting algorithm that works by repeatedly swapping the adjacent elements if they are in the wrong order. This algorithm is not suitable for large data sets as its average and worst-case time complexity are quite high.We sort the array using multiple passes. After the fir
8 min read
Breadth First Search or BFS for a Graph Given a undirected graph represented by an adjacency list adj, where each adj[i] represents the list of vertices connected to vertex i. Perform a Breadth First Search (BFS) traversal starting from vertex 0, visiting vertices from left to right according to the adjacency list, and return a list conta
15+ min read
Binary Search Algorithm - Iterative and Recursive Implementation Binary Search Algorithm is a searching algorithm used in a sorted array by repeatedly dividing the search interval in half. The idea of binary search is to use the information that the array is sorted and reduce the time complexity to O(log N). Binary Search AlgorithmConditions to apply Binary Searc
15 min read
Insertion Sort Algorithm Insertion sort is a simple sorting algorithm that works by iteratively inserting each element of an unsorted list into its correct position in a sorted portion of the list. It is like sorting playing cards in your hands. You split the cards into two groups: the sorted cards and the unsorted cards. T
9 min read
Array Data Structure Guide In this article, we introduce array, implementation in different popular languages, its basic operations and commonly seen problems / interview questions. An array stores items (in case of C/C++ and Java Primitive Arrays) or their references (in case of Python, JS, Java Non-Primitive) at contiguous
4 min read
Sorting Algorithms A Sorting Algorithm is used to rearrange a given array or list of elements in an order. For example, a given array [10, 20, 5, 2] becomes [2, 5, 10, 20] after sorting in increasing order and becomes [20, 10, 5, 2] after sorting in decreasing order. There exist different sorting algorithms for differ
3 min read