在一个数组中找出和最大的连续几个数。(至少包含一个数)
例如:
数组A[] = [−2, 1, −3, 4, −1, 2, 1, −5, 4],则连续的子序列[4,−1,2,1]有最大的和6.
输入格式
第一行输入一个不超过1000的整数n。
第二行输入n个整数A[i]。
输出格式
第一行输出一个整数,表示最大的和。
样例输入
3
1 1 -2
样例输出
2
#include<stdio.h>
int main()
{
int sum=0,max=0;
int n;
scanf("%d",&n);
int a[n];
for(int i=0;i<n;i++) scanf("%d",&a[i]);
max=a[0];
for(int i=0;i<n;i++){
sum+=a[i];
if(max<sum) max=sum;
else if(sum<0) sum=0;
}
printf("%d",max);
return 0;
}
想了半天也没想到怎么做,参考了别人的做法,我实在有点不开窍。
思路:
用max保存当前数组计算出的最大值,不断往子数组里面增加新的数。如果没有超过最大值,那么最大值就是最大,如果超过,更新最大值。如果加新的数的时候发现sum<0了,那么重新开始。(因为sum<0只能给后续带来伤害而没有帮助)