题目:
给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。
请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。
任何误差小于 10-5 的答案都将被视为正确答案。
算法:
方法一:前缀和
时间复杂度O(2n)
import "math"
func findMaxAverage(nums []int, k int) float64 {
for i := range nums {
if i > 0 {
nums[i] = nums[i - 1] + nums[i]
}
}
ans := float64( math.MinInt64)
for i := 0; i + k <= len(nums); i ++ {
avg := float64(0)
if i == 0 {
avg = float64(nums[i + k - 1]) / float64(k)
} else {
avg = float64(nums[i + k - 1] - nums[i - 1]) / float64(k)
}
if avg > ans {
ans = avg
}
}
return ans
}
方法二:滑动窗口
滑动窗口减少了一次计算前缀的循环,时间复杂度o(n)
import "math"
func findMaxAverage(nums []int, k int) float64 {
ans := float64(math.MinInt64)
sum := float64(0)
for left, right := 0, 0; right < len(nums); right ++ {
sum = sum + float64(nums[right])
if right - left + 1 == k {
avg := sum / float64(k)
if avg > ans {
ans = avg
}
sum = sum - float64(nums[left])
left ++
}
}
return ans
}