子数组最大平均数 I
给你一个由 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
题目解析:
固定长度子数组计算平均值,取最大平均值返回。
解法思路:
暴力解法:计算每个长度为k的子数组的平均数,取最大返回,时间复杂度O(nk)。
固定长度子数组,可以利用定长滑动窗口解法将时间复杂度降到最O(n)。
1.入窗口
2.判断
3.出窗口
4.更新结果
更新结果的代码放在窗口大小达到 k
之后。
代码:
class Solution {
public:double findMaxAverage(vector<int>& nums, int k) {int left=0,right=0;double sum=0,ave=INT_MIN;for(;right<nums.size();right++){//入窗口sum+=nums[right];if(right-left+1<k)continue;//判断 + 出窗口if(right-left+1 > k)sum-=nums[left++]; //更新结果ave=max(sum/k,ave); }return ave;}
};
本题细节:
将maxAve
初始化为INT_MIN
,确保可以正确处理所有负数的情况。