连续子数组的最大和

来源:互联网 发布:中国企业海外投资数据 编辑:程序博客网 时间:2024/05/29 09:30

题目描述

输入一个整型数组,数组里有正数也有负数,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

输入描述

输入第一行一个整数序列的序列长度,如:8

输入第二行为整数序列,数字用空格分隔,如:1 -2 3 10 -4 7 2 -5

输出描述

上述最大子数组为{3,1,-4,7,2},因此输出为18


分析

方法1:枚举所有子数组并求和。  先从第一个数字开始找到最大的子数组的和,再从第二个数开始找到子数组的和,并找到最大的数,第二个数开始的最大数和第一个开始的最大数比,保留其中较大的,然后从第三个数开始找到最大的子数组的和,重复上述过程,直到找到最大的连续子数组的最大和。

备注:该方法效率会比较低 


方法2:采用一个for循环,定义局部变量sum和全局变量max,如果子数组加上后一个数后大于等于后一个数时,那么sum变为sum加上后一个数,否则sum变为后一个数。然后判断sum是否大于max,如果大于max,那么用sum覆盖max,否则max保持不变。


代码方法1

#include<stdio.h>
int main()
{
int i,j,k,n,max,sum;
scanf("%d",&n);
int x[n];
for(i=0;i<n;i++)//输入序列x
scanf("%d",&x[i]);
for(i=0;i<n;i++)//找出子序列
{
sum=0; 
//注意这里sum=0的作用,即将sum初始化,重新从0开始求和。
for(j=i;j<n;j++)
{
sum+=x[j];//求和
if(max<sum) max=sum;
}
}
printf("最大和=%d\n",max);
return 0;
 } 


代码方法2

#include<stdio.h>
int main()
{
int sum=0,max=0;
int n,i;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
if(sum+a[i]>=a[i])
sum+=a[i];
else
sum=a[i];
if(sum>max)
max=sum;
}
printf("%d",max);
return 0;
 }