题目:子数组最大平均数 (滑动窗口)
给一个整数数组,找出平均数最大且长度为k的下标连续的子数组,并输出该最大平均数。
输入: [1,12,-5,-6,50,3], k=4输出:12.75
最大平均数(12-5-6+50)/4 =51/4 = 12.75
算法:
1.暴力算法 (看代码!!)
2.暴力减少时间的算法把每个子数组的平均数求出来会超时,第一个子数组的总和是所有数加起来,这个没办法简略,但是下一个子数组的总和是上一个子数组的总和减去一个数加上后一个数。
所以不用把子数组中所有数再求一遍和,利用上一个子数组求值。
(看代码!!)
代码:
/*************************************************
作者:She001
时间:2022/8/29
题目:子数组最大平均数
给一个整数数组,找出平均数最大且长度为k的下标连续的子数组,并输出该最大平均数。
输入: [1,12,-5,-6,50,3], k=4输出:12.75
最大平均数(12-5-6+50)/4 =51/4 = 12.75
算法:1.暴力算法
2.暴力减少时间的算法把每个窗口的平均数求出来会超时,第一个窗口的总和是所有数加起来,这个没办法简略,但是下一个窗口的总和是上一个窗口的总和减去一个数加上后一个数。
所以不用把窗口中所有数再求一遍和,利用上一个窗口
***************************************************/
#include<bits/stdc++.h>
using namespace std;
/// 1.暴力算法
/*
for循环,内嵌一个循环求 k 个数值的和
找到最大的平均值
看代码:
*/
double fangfa_1(int num[],int k,int n)//num 数组 ,k 子数组的长度 ,n num数组的长度
{
if(n<k)
{
cout<<"参数错误!\n"<<endl;
return 0;
}
int sum=0;//最大值
int mm;//比较的数
//把第一个 k 个数值的和作为比较的数
for(int i=0;i<k;i++)
{
sum+=num[i];
//cout<<"sum= "<<sum<<endl;
}
//比较最大的数
for(int i=1;i<=n-k;i++)
{
mm=0;
for(int j=i;j<(k+i);j++)
{
mm+=num[j];
}
if(mm>sum)
{
sum=mm;
}
//cout<<"mm= "<<mm<<endl;
//cout<<"sum= "<<sum<<endl;
}
double aa=1.0*sum/k;
return aa;
}
// 2.暴力减少时间的算法把每个窗口的平均数求出来会超时,第一个窗口的总和是所有数加起来,这个没办法简略,但是下一个窗口的总和是上一个窗口的总和减去一个数加上后一个数。
//所以不用把窗口中所有数再求一遍和,利用上一个窗口
double fangfa_2(int num[],int k,int n)//num 数组 ,k 子数组的长度 ,n num数组的长度
{
if(n<k)
{
cout<<"参数错误!\n"<<endl;
return 0;
}
int sum=0;//最大值
int mm=0;//比较的数
//把第一个 k 个数值的和作为比较的数
for(int i=0;i<k;i++)
{
mm+=num[i];
}
sum=mm;
for(int i=k;i<n;i++)
{
mm-=num[i-k];//减了,上次的第一个
mm+=num[i];//加上这次的最后一个
if(mm>sum)
{
sum=mm;
}
//cout<<"mm= "<<mm<<endl;
//cout<<"sum= "<<sum<<endl;
}
double aa=1.0*sum/k;
return aa;
}
int main()
{
int num[]={1,5,2,20,9,15,6,7,15,3,20,1,0,3,5,10,26};
double a=fangfa_1(num,4,17);
double b=fangfa_2(num,4,17);
cout<<"a= "<<a<<endl;
cout<<"b= "<<b<<endl;
}
105

被折叠的 条评论
为什么被折叠?



