Maximum Average Subarray I

Updated on 05 June, 2025
Maximum Average Subarray I header image

Problem Statement

You are tasked with finding a contiguous subarray within an array nums, which consists of n elements. This specific subarray should have a length exactly equal to the integer k. Out of all possible subarrays of length k, your goal is to identify the one that yields the maximum average value. The output should be this maximum average. While calculating, you need to ensure that a very minimal computational error of less than 10^-5 can be tolerated, catering to possible floating-point arithmetic issues.

Examples

Example 1

Input:

nums = [1,12,-5,-6,50,3], k = 4

Output:

12.75000

Explanation:

Maximum average is (12 - 5 - 6 + 50) / 4 = 51 / 4 = 12.75

Example 2

Input:

nums = [5], k = 1

Output:

5.00000

Constraints

  • n == nums.length
  • 1 <= k <= n <= 105
  • -104 <= nums[i] <= 104

Approach and Intuition

Step-by-step Breakdown

  1. Sliding Window Utilization: Knowing k is fixed, a sliding window approach seems fitting. This reduces the problem to dynamically adjusting the sum of the subarray to compute different averages efficiently as you move from one subarray to the next along nums.

  2. Initial Subarray: Begin by calculating the sum and average of the first k elements in nums.

  3. Slide Through the Array: Iterate from the kth element to the end of the array. For each step, adjust your current subarray to include the next element and exclude the former first element of the previous subarray:

    • Remove the element that slides out of the window from the sum and add the new element that comes into the window.
    • This adjustment keeps the window size constant at k and merely shifts it one position at a time across nums.
  4. Track Maximum Average: Each time you update your window sum upon sliding, calculate the new average and compare it with a maintained value of the maximum average. Update this maximum with the current average if the latter is larger.

  5. Precision Requirement: Ensure that your calculations adhere to the requisite precision of a difference smaller than 10^-5 by controlling the data types used and/or the manner of your average computation.

  6. Return Result: After the loop concludes, the maintained maximum average value is the result, representing the highest average obtainable from any subarray of length k within nums.

  • Example Insights:
    • In the first example, you start with a window spanning the elements [1, 12, -5, -6] and subsequently slide the window right. Notice how incorporating all highest values while offsetting negatives maximizes the average as you skew toward larger numbers.
    • In the second example, with only one element and k=1, the only subarray and its average are trivially the element itself.

This approach of using a sliding window ensures that we compute the maximum average in an efficient manner without recalculating the sum for overlapping parts of subarrays repetitively, leveraging both time efficiency and simplicity in implementation.

Solutions

  • Java
java
public class Solution {
    public double calculateMaxAverage(int[] values, int windowSize) {
        double total = 0;
        for(int i = 0; i < windowSize; i++)
            total += values[i];
        double maxAverage = total;
        for(int i = windowSize; i < values.length; i++){
            total += values[i] - values[i - windowSize];
            maxAverage = Math.max(maxAverage, total);
        }
        return maxAverage / windowSize;
    }
}

The provided Java solution efficiently calculates the maximum average of any subarray of a specified size (windowSize) within an array of integers (values). The method calculateMaxAverage initiates by calculating the sum of the first windowSize elements in the array. It then iteratively adjusts this sum by sliding the window one element at a time across the array—from windowSize to the end of the array. Each step involves adding the next element in the array and subtracting the element that is no longer in the window, thus efficiently maintaining the sum of the current window without the need to recalculate the sum from scratch. The maximum average is computed by keeping track of the highest average observed during these sliding window iterations. Finally, the maximum average is returned by dividing the highest found sum by windowSize.

Here’s a breakdown of how this algorithm is implemented:

  • Initialize total with the sum of the first windowSize elements.
  • The initial maximum average maxAverage is set to total.
  • Loop through the array starting from the index windowSize to the end of the array.
    • For each step, adjust total by adding the current element and subtracting the element that just moved outside the window.
    • Update maxAverage if the new total yields a higher sum.
  • Calculate the final maximum average by dividing maxAverage by windowSize.
  • Return the calculated maximum average.

This approach ensures an optimal calculation with a time complexity of O(n), where n is the number of elements in the array, making it suitable for larger datasets without performance degradation.

Comments

No comments yet.