题目描述
给一个长度为n的序列,你需要求出其中连续m个数的和的最大值是多少。
输入格式
第一行给出一个数字T,表示数组总数 (t<100)
每组数据的第一行有两个数字 n,m (0<m≤n≤1e5)
第二行有n个数字ai (0<ai<1e9)
输出格式
对于每组数据,输出最大的连续m个数之和
输入样例 复制
2
5 2
2 5 4 1 6
8 3
3 5 8 2 1 8 9 7
输出样例 复制
9
24
一、时间复杂度O(N²) TLE
#include<iostream>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int n,m;
cin>>n>>m;
int a[n];
for(int i=0;i<n;i++){
cin>>a[i];
}
int max=a[0];
for(int i=0;i<=n-m;i++){
int sum=0;
for(int k=i;k<i+m;k++){
sum+=a[k];
}
if(sum>max){
max=sum;
}
}
cout<<max<<endl;
}
return 0;
}
二、时间复杂度O(n) AC
#include<iostream>
using namespace std;
int main(){
int t;
cin>>t;
while(t--){
int n,m;
cin>>n>>m;
long long a[n];
for(int i=0;i<n;i++){
cin>>a[i];
}
long long s[n]={a[0],0}; //s数组是前缀和,开成long long
for(int i=1;i<n;i++){
s[i]=s[i-1]+a[i]; //s[i]是前i个数的和
}
long long max=s[m-1];//max初始化为前m个数的和
int j=n-m;
for(int i=0;i<j;i++){
long long sum=s[i+m]-s[i]; //中间m个数的和即s[i+m]-s[i]
if(sum>max){
max=sum;
}
}
for(int i=n-1;i>n-m-1;i--){ //算最后m个数的和,因为不能通过上面的循环计算
long long sum=0;
sum+=a[i];
}
if(sum>max){
max=sum;
}
cout<<max<<endl;
}
return 0;
}