LeetCode 643. Maximum Average Subarray I
Contents
643.MaximumAverageSubarrayI.py
from typing import List
class Solution:
def findMaxAverage(self, nums: List[int], k: int) -> float:
curr_sum = 0
max_sum = float('-inf')
for i, num in enumerate(nums):
curr_sum += num
if i > k - 1:
curr_sum -= nums[i - k]
if i >= k - 1:
max_sum = max(max_sum, curr_sum)
return max_sum / k
if __name__ == '__main__':
sol = Solution()
assert sol.findMaxAverage(nums=[1, 12, -5, -6, 50, 3], k=4) == 12.75
assert sol.findMaxAverage(nums=[5], k=1) == 5.0
assert sol.findMaxAverage(nums=[-1], k=1) == -1
lc643MaximumAverageSubarrayI_test.go
package lc
import (
"testing"
)
func findMaxAverage(nums []int, k int) float64 {
var currSum int
maxSum := float64(-1 << 63) // equivalent to -infinity in float64
for i, num := range nums {
currSum += num // adding the current number to the sum
if i >= k { // when i is equal to or greater than k, subtract the leftmost number in the window from the sum
currSum -= nums[i-k]
}
if i >= k-1 { // if the window size is k, update maxSum
maxSum = max(maxSum, float64(currSum))
}
}
return maxSum / float64(k)
}
func TestFindMaxAverage(t *testing.T) {
tests := []struct {
nums []int
k int
want float64
}{
{[]int{1, 12, -5, -6, 50, 3}, 4, 12.75},
{[]int{5}, 1, 5.0},
{[]int{-1}, 1, -1.0},
}
for _, tt := range tests {
got := findMaxAverage(tt.nums, tt.k)
if got != tt.want {
t.Errorf("findMaxAverage(%v, %v) = %v; want %v", tt.nums, tt.k, got, tt.want)
}
}
}