题目
给你一个由
n
个元素组成的整数数组nums
和一个整数k
。请你找出平均数最大且 长度为
k
的连续子数组,并输出该最大平均数。任何误差小于
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
提示:
n == nums.length
1 <= k <= n <= 105
-104 <= nums[i] <= 104
解题思路
法一:滑动窗口(执行用时:140ms,内存消耗:19.4MB)
由于子数组的长度k是固定的,因此找到子数组的最大元素和就可以算出子数组的最大平均数。想象窗口滑动的过程,令初始最大元素和为数组前k个数字的和,即sum(nums[:k]) ,然后从k开始遍历数组,窗口开始向后滑动一格,即新的元素和为上一个窗口求得的元素和加上窗口滑动时新加入的元素值,再减去上个窗口最前面的元素值。也就是右边加一格,左边减一格。
注意:返回值是浮点型,因此计算除法时需要进行数据类型转换。
class Solution(object):
def findMaxAverage(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: float
"""
maxsum = sumk = sum(nums[:k])
for i in range(k,len(nums)):
sumk = sumk + nums[i] - nums[i-k]
maxsum = max(maxsum,sumk)
return maxsum / float(k)
时间复杂度:O(n),其中n是数组nums的长度,遍历数组一次。
空间复杂度:O(1)