Maximum Average Subarray I
Maximum average of any length-k subarray — fixed-size sliding window over a running sum.
3 min read
sliding-window array
Problem#
Find the contiguous subarray of length k with the maximum average. Return that average.
Examples#
nums = [1,12,-5,-6,50,3], k = 4→12.75
Constraints#
1 <= k <= nums.length <= 10^5.
Approach#
Fixed-size window. Maintain a running sum; at each step add the new element and subtract the leaving one. Track the max sum, divide by k at the end.
Solution#
class Solution {public: double findMaxAverage(vector<int>& nums, int k) { long long sum = 0; for (int i = 0; i < k; ++i) sum += nums[i]; long long best = sum; for (int i = k; i < (int)nums.size(); ++i) { sum += nums[i] - nums[i - k]; best = max(best, sum); } return (double)best / k; }};func findMaxAverage(nums []int, k int) float64 { var sum int64 for i := 0; i < k; i++ { sum += int64(nums[i]) } best := sum for i := k; i < len(nums); i++ { sum += int64(nums[i] - nums[i-k]) if sum > best { best = sum } } return float64(best) / float64(k)}from typing import List
class Solution: def findMaxAverage(self, nums: List[int], k: int) -> float: s = sum(nums[:k]) best = s for i in range(k, len(nums)): s += nums[i] - nums[i - k] if s > best: best = s return best / kfunction findMaxAverage(nums, k) { let sum = 0; for (let i = 0; i < k; i++) sum += nums[i]; let best = sum; for (let i = k; i < nums.length; i++) { sum += nums[i] - nums[i - k]; if (sum > best) best = sum; } return best / k;}class Solution { public double findMaxAverage(int[] nums, int k) { long sum = 0; for (int i = 0; i < k; i++) sum += nums[i]; long best = sum; for (int i = k; i < nums.length; i++) { sum += nums[i] - nums[i - k]; if (sum > best) best = sum; } return (double) best / k; }}function findMaxAverage(nums: number[], k: number): number { let sum = 0; for (let i = 0; i < k; i++) sum += nums[i]; let best = sum; for (let i = k; i < nums.length; i++) { sum += nums[i] - nums[i - k]; if (sum > best) best = sum; } return best / k;}Editorial#
The fixed-window pattern: precompute first window, then “rolling” updates. Using long long avoids overflow (nums[i] up to 10⁴ × 10⁵ = 10⁹, still fits, but defensive). Dividing once at the end keeps the comparison integer and exact.
Complexity#
- Time: O(n).
- Space: O(1).
Concept revision#
Related#