题目简述
给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数。
示例 :
输入:[1,12,-5,-6,50,3], k = 4
输出:12.75
解释:最大平均数 (12-5-6+50)/4 = 51/4 = 12.75
提示
1 <= k <= n <= 30,000。
所给数据范围 [-10,000,10,000]。
题目分析
这又是一道典型的滑动窗口题,相信大家看到题目之后心里就已经有了思路,就是把每个窗口的值加起来,然后取最大的值算平均数即可。但是有两点需要注意,第一点是在算窗口内数字总和时不能每次都从头加到尾,这样的话运行会超时,解决方法是直接减去头部再加上新的尾部即可。第二点是存储最大数的变量在定义时很多人会把它定义为0,这样如果最大数为负数的话就没法进行替代,从而导致结果不正确。代码如下:
class Solution {
public:
double findMaxAverage(vector<int>& nums, int k) {
long right=0;
int left=0;
long sum1=0;
double num=0;
if(k==1){
if(nums.size()==1){
num=nums[0];
}
for(left=0;left<nums.size()-1;left++){
if(nums[left]<nums[left+1]&&nums[left+1]>num)num=nums[left+1];
}
}
if(k!=1){
right=k-1;
for(left=0;left<=nums.size()-k;left++){
if(left==0){
for(int i=left;i<=right;i++){
sum1=sum1+nums[i];
}
num=sum1;
}
if(left>0){
sum1=sum1-nums[left-1]+nums[right];
if(sum1>num)num=sum1;
}
right++;
}
}
return num/k;
}
};
虽然代码有点长,但也几乎是双百选手了,大家可以自行缩减代码,在评论区交流一下。