题目:对于一个有正有负的整数数组,请找出总和最大的连续数列。
给定一个int数组A和数组大小n,请返回最大的连续数列的和。
1.思路:
(1)定义两个变量,一个保存最终的最大和,一个是临时变量,不能初始化为0,初始化都为数组第一个数(防止都是负数,它的和肯定是负数)。
(2)for循环依次向后遍历,如果tmp临时变量是负数,说明之前的正数都不能弥补负数的坑,这时赋值为下一个数的值;如果是tmp是正数,说明之前的数有必要加上。
(3)最后tmp与保存的连续子数组最大和进行比较,如果tmp大,则更新res的值,最后返回tmp的值。
2.示意图
3.遵循的原则
之前是负数就不要了,从下一个开始。
如果全是负数,只取一个最大的负数。
int MaxNum(int arr[],int n)
{
int sum=arr[0];
int tmp=arr[0];
for(int i=1;i<n;i++) //tmp已经保存了第一个数,所以第一个数不用遍历了。
{
if(tmp>0) //sum[i-1]是否大于0,小于零没有必要。从下一个开始算
{
tmp=tmp+arr[i];
}
else //sum[i-1]小于零没有必要。从下一个开始计算
{
tmp=arr[i];
}
if(sum>tmp)
{
sum=tmp;
}
}
return sum;
}
int main()
{
int arr[]={3, -4, 6, -3, 7};
int len=sizeof(arr)/sizeof(arr[0]);
int ret=MaxNum(arr,len);
printf("%d\n",ret);
return ret;
}