子数组最大平均数
难度:简单
给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。
请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。
任何误差小于
1
0
−
5
10^{-5}
10−5 的答案都将被视为正确答案。
示例 1:
输入:nums = [1,12,-5,-6,50,3], k = 4
输出:12.75
解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75
示例 2:
输入:nums = [5], k = 1
输出:5.00000
解法一、暴力算法
思路: 从第 k 个数开始,遍历计算当前位置倒数前k个数之和,依次对比取最大值。
时间复杂度:
O
(
n
)
O(n)
O(n),其中 n 是数组 nums 的长度。遍历数组一次,实际是
O
(
k
n
−
k
2
+
k
)
O(kn-k^2+k)
O(kn−k2+k),
空间复杂度:
O
(
1
)
O(1)
O(1)。
class Solution:
def findMaxAverage(self, nums: List[int], k: int) -> float:
maxs = -1e9
for i in range(k, len(nums)+1):
sums = sum(nums[i-k: i])
if maxs < sums:
maxs = sums
return maxs/k
解法二、滑动窗口
思路: 先计算中从0到k的前k个数之和,再从k开始遍历数组,依次往后添加一位数,往前删除一位数,再比较新的和与原来的大小,从而获取最大值。
时间复杂度:
O
(
n
)
O(n)
O(n),其中 n 是数组 nums 的长度。遍历数组一次,实际是
O
(
2
n
−
k
)
O(2n-k)
O(2n−k)
空间复杂度:
O
(
1
)
O(1)
O(1)。
class Solution:
def findMaxAverage(self, nums: List[int], k: int) -> float:
sums = sum(nums[:k])
maxs = sums
for i in range(k,len(nums)):
sums = sums - nums[i-k] + nums[i]
if maxs < sums:
maxs = sums
return maxs/k
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/maximum-average-subarray-i