[剑指offer] 连续子数组最大和

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/guorong520/article/details/81141995
题目:对于一个有正有负的整数数组,请找出总和最大的连续数列。
给定一个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;
}

猜你喜欢

转载自blog.csdn.net/guorong520/article/details/81141995