题目:
示例:
分析:
给一个数组,问数组里长度为k的连续数组中的最大平均值是多少.
这题已经把意思说的很明白了,并且连子数组的长度都固定了,并且是连续的,这里可以直接使用固定长度的滑动窗口来计算.
用两个指针来在数组里划定一个长度为k的范围,然后计算指针范围内的平均数即可.然后将指针总体从左向右移动,直到移动到数组的末尾即可.
在移动的时候,在范围内的数组将少一个最左端的数,再多一个右端的数,而中间部分的数是不变的,因此为了减少重复计算,我们可以用一个变量来接收滑动窗口内的数据总和,然后再移动的时候,把总和减去左端的数(移动前左指针所指),再加上右端的数(移动后右指针所指).
代码+运行结果:
class Solution {
public:
double findMaxAverage(vector<int>& nums, int k) {
int l=0;int r=l+k-1;
double temp=0.0;
//计算初始平均值(前k个数)
for(int i=0;i<k;i++){
temp+=nums[i];
}
double res=temp/k;
while(r<nums.size()-1){
//滑动窗口
temp-=nums[l++];
temp+=nums[++r];
res=max(res,temp/k);
}
return res;
}
};