题目描述
给定 n 个整数,找出平均数最大且长度为 k 的连续子数组,并输出该最大平均数。
示例 1:
输入: [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]。
解答 By 海轰
提交代码(暴力解法-超时)
double findMaxAverage(vector<int>& nums, int k) {
int len=nums.size();
double pmax;
for(int i=0;i<len-k+1;++i)
{
double sum=0;
for(int j=i;j<i+k;++j)
{
sum+=nums[j];
}
if(i==0)
pmax=sum/k;
else
pmax= pmax<(sum/k)? sum/k:pmax;
}
return pmax;
}
运行结果
提交代码(累计求和)
double findMaxAverage(vector<int>& nums, int k) {
int len=nums.size();
double sums[len];
// for(int i=0;i<len;++i)
// sums[i]=0;
sums[0]=nums[0];
for(int i=1;i<len;++i)
sums[i]=sums[i-1]+nums[i];
double pmax=sums[k-1]/k;
for(int i=k;i<len;++i)
{
double temp=(sums[i]-sums[i-k])/k;
pmax= pmax<temp? temp:pmax;
}
return pmax;
}
运行结果
提交代码(滑动窗口-优化版)
double findMaxAverage(vector<int>& nums, int k) {
int len=nums.size();
double sum=0;
for(int i=0;i<k;++i)
sum+=nums[i];
double result=sum;
for(int i=k;i<len;++i)
{
sum=sum+nums[i]-nums[i-k];
result=max(sum,result);
}
return result/k;
}
运行结果
题目来源
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-average-subarray-i