https://leetcode-cn.com/problems/maximum-average-subarray-i/
给定 n
个整数,找出平均数最大且长度为 k
的连续子数组,并输出该最大平均数。
输入:[1,12,-5,-6,50,3], k = 4
输出:12.75
解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75
先遍历一次,求数组每个位置的 preSum,然后再遍历一次,求长度为 k 的每个区间的最大和。最终除以 k 得到最大平均数。
利用 preSum 数组,
class Solution(object):
def findMaxAverage(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: float
"""
n = len(nums)
preSum = [0] * (n+1)
for i in range(n):
preSum[i+1] = preSum[i] + nums[i]
largest = float('-inf')
for i in range(k-1, n):
# 前缀和 sum(i, j) = preSum[i + 1] - preSum[j]
largest = max(largest, preSum[i+1] - preSum[i+1-k])
return largest/float(k)
nums = [1,12,-5,-6,50,3]
k = 4
s = Solution()
print(s.findMaxAverage(nums, k))
抽象成长度固定为 k 的滑动窗口。
需要注意的是,需要根据 i 的位置,计算滑动窗口是否开始、是否要移除最左边元素:
class Solution(object):
def findMaxAverage(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: float
"""
sums = 0
largest = float('-inf')
for i, num in enumerate(nums):
sums += num
if i >= k:
sums -= nums[i - k]
if i >= k - 1:
largest = max(sums, largest)
return largest / float(k)
https://leetcode-cn.com/problems/maximum-average-subarray-i/solution/jing-dian-ti-mu-de-jing-dian-zuo-fa-pres-ze08/