Sunday, November 17, 2024
Google search engine
HomeLanguagesPython3 Program to Find the subarray with least average

Python3 Program to Find the subarray with least average

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

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_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. 

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.


Output: 

Subarray between [3, 5] has minimum average

Time Complexity: O(n) 
Auxiliary Space: O(1)

Please refer complete article on Find the subarray with least average for more details!

Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!

Dominic Rubhabha-Wardslaus
Dominic Rubhabha-Wardslaushttp://wardslaus.com
infosec,malicious & dos attacks generator, boot rom exploit philanthropist , wild hacker , game developer,
RELATED ARTICLES

Most Popular

Recent Comments