Given an array arr[] of size n and integer k such that k
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
We strongly recommend that you click here and practice it, before moving on to the solution.
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).
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_sumBelow is the implementation of above algorithm.
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);
}
}
Output:
Subarray between [3, 5] has minimum averageTime Complexity: O(n)
Auxiliary Space: O(1)Please refer complete article on Find the subarray with least average for more details!