Maximum Average Subarray I
EasyUpdated: Aug 2, 2025
Practice on:
Problem
You are given an integer array nums consisting of n elements, and an integer k.
Find a contiguous subarray whose length is equal to k that has the maximum average value and return this value. Any answer with a calculation error less than 10-5 will be accepted.
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.length1 <= k <= n <= 10^5-10^4 <= nums[i] <= 10^4
Solution
Method 1 – Sliding Window
Intuition
To find the maximum average of a subarray of length k, we can use a sliding window of size k and keep track of the sum as we move the window. This allows us to efficiently compute the sum for each window in O(1) time after the first window.
Approach
- Compute the sum of the first k elements.
- Slide the window from left to right:
- Subtract the element leaving the window and add the new element entering the window.
- Track the maximum sum seen so far.
- Return the maximum sum divided by k as the maximum average.
Code
C++
class Solution {
public:
double findMaxAverage(vector<int>& nums, int k) {
int n = nums.size();
double sum = 0, ans = -1e9;
for (int i = 0; i < k; ++i) sum += nums[i];
ans = sum;
for (int i = k; i < n; ++i) {
sum += nums[i] - nums[i-k];
ans = max(ans, sum);
}
return ans / k;
}
};
Go
func findMaxAverage(nums []int, k int) float64 {
n := len(nums)
sum := 0
for i := 0; i < k; i++ {
sum += nums[i]
}
ans := sum
for i := k; i < n; i++ {
sum += nums[i] - nums[i-k]
if sum > ans {
ans = sum
}
}
return float64(ans) / float64(k)
}
Java
class Solution {
public double findMaxAverage(int[] nums, int k) {
int n = nums.length;
double sum = 0, ans = -1e9;
for (int i = 0; i < k; ++i) sum += nums[i];
ans = sum;
for (int i = k; i < n; ++i) {
sum += nums[i] - nums[i-k];
ans = Math.max(ans, sum);
}
return ans / k;
}
}
Kotlin
class Solution {
fun findMaxAverage(nums: IntArray, k: Int): Double {
val n = nums.size
var sum = 0.0
for (i in 0 until k) sum += nums[i]
var ans = sum
for (i in k until n) {
sum += nums[i] - nums[i-k]
ans = maxOf(ans, sum)
}
return ans / k
}
}
Python
class Solution:
def findMaxAverage(self, nums: list[int], k: int) -> float:
n = len(nums)
s = sum(nums[:k])
ans = s
for i in range(k, n):
s += nums[i] - nums[i-k]
ans = max(ans, s)
return ans / k
Rust
impl Solution {
pub fn find_max_average(nums: Vec<i32>, k: i32) -> f64 {
let n = nums.len();
let mut sum: i32 = nums[..k as usize].iter().sum();
let mut ans = sum;
for i in k as usize..n {
sum += nums[i] - nums[i-k as usize];
ans = ans.max(sum);
}
ans as f64 / k as f64
}
}
TypeScript
class Solution {
findMaxAverage(nums: number[], k: number): number {
let sum = 0;
for (let i = 0; i < k; ++i) sum += nums[i];
let ans = sum;
for (let i = k; i < nums.length; ++i) {
sum += nums[i] - nums[i-k];
ans = Math.max(ans, sum);
}
return ans / k;
}
}
Complexity
- ⏰ Time complexity:
O(n), since we process each element once. - 🧺 Space complexity:
O(1), only a constant number of variables are used.