指尖划过的轨迹,藏着最细腻的答案~
题目:
给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。
请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。
任何误差小于 的答案都将被视为正确答案。
示例 1:
输入:nums = [1,12,-5,-6,50,3], k = 4
输出:12.75
解释:最大平均数
示例 2:
输入:nums = [5], k = 1
输出:5.00000
提示:
分析:
本题所找的最大平均数,即是最大连续子数组的和。相当于从前k个元素开始,每次最前面丢掉一个,最后面增加一个,在这个过程中统计窗口k中的数字之和,这就是定长滑动窗口:窗口大小不变,恒定为k。
具体的由于本题有负数,因此我们可以将第一窗口的和初始化为统计的最大值ans,然后在遍历剩余的数字,更新最大值ans。
**注意:**在最终计算平均值时,我们需要注意小数的处理,直接除以k会导致精度偏移,因此我们需要使用static_cast转换成double类型。
AC代码:
class Solution {
public:
double findMaxAverage(vector<int>& nums, int k) {
int ans = 0, sum = 0;
for (int i = 0; i < k; i++) {
ans += nums[i];
}
sum = ans;
for (int i = k; i < nums.size(); i++) {
sum -= nums[i - k];
sum += nums[i];
ans = max(ans, sum);
}
return static_cast<double>(ans) / k;
}
};