// Source : https://leetcode-cn.com/problems/maximum-average-subarray-i/
// Date : 2021-10-13
/******************************************************************************************
给你一个由 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 <= 10^5
-10^4 <= nums[i] <= 10^4
******************************************************************************************/
/*******************************************************************************************************
题目分析:利用滑动窗口,将窗口内的数据进行加和,窗口的大小就是k的大小,如果下一次的和比当前的和大,就更新最大值,
直到遍历结束,得到的最大值返回即可。
********************************************************************************************************/
class Solution {
public:
double findMaxAverage(vector<int>& nums, int k) {
int n = nums.size();
// 初始化 sum,c从初值为0开始累加
int sum = accumulate(nums.begin(), nums.begin() + k, 0);
int res = sum;
for (int i = 1; i + k - 1 < n; i++) {
// 加上右边新元素,减去左边旧元素
sum += nums[i + k - 1] - nums[i - 1];
//将较大值返回
res = max(res, sum);
}
return (double)res / k;
}
};
// class Solution {
// public:
// double findMaxAverage(vector<int>& nums, int k)
// {
// int max = 0;
// double sum = 0, ave;
// if(nums.size() > 1)
// {
// for(int i = 0;i <= nums.size() - k;++i)
// {
// sum = 0;
// for(int j = i;j < k + i;++j)
// {
// sum += nums[j];
// }
// if(sum > max)
// max = sum;
// }
// ave = sum / k;
// return ave;
// }
// else
// return nums[0];
// }
// };