和01一样,定长滑动窗口,可以直接照搬01的套路代码
class Solution {
public double findMaxAverage(int[] nums, int k) {
int l=0;
int r=0;
double ave=0.0;
double sum=0.0;
while(r<k){
sum=sum+nums[r];
r++;
}
ave=sum/k;
for(;r<nums.length;++l,++r){
sum=sum+nums[r];
sum=sum-nums[l];
double newAve=sum/k;
if(newAve>ave){
ave=newAve;
}
}
return ave;
}
}
但是效果不是很好
OK作出修改
1、不应该着急计算平均值的,只要找到最大窗口数字的和即可,最后再返回一个double值
2、其次for循环中两个变量边界没必要,只需要一个右边界即可,r-k即为左边界
class Solution {
public double findMaxAverage(int[] nums, int k) {
int l=0;
int r=0;
double ave=0.0;
int sum=0;
while(r<k){
sum=sum+nums[r];
r++;
}
int maxSum=sum;
for(;r<nums.length;++r){
sum=sum+nums[r]-nums[r-k];
if(sum>maxSum){
maxSum=sum;
}
}
ave=1.0*maxSum/k;
return ave;
}
}