数组中最大和的子数组

只需要输出最大子数组和结果

[08:27:34] gcc sonarrysum.c 
[08:27:37] ./a.out
18
[08:27:39] cat sonarrysum.c 
#include<stdio.h>
void max(int a[],int len)
{
    int i,max=0,count=0;
    for(i=0;i<len;i++)//在这里我们先不管数组全部为负数的情况,然后我们会得出只要累加结果小于0了,那就说明这个累加和不是最大的和(因为不全为负数就肯定是有正数了的不是)
    {
        count+=a[i];
        if(count<0)
            count=0;
        if(count>max)//如果大于之前的最大值就覆盖
            max=count;
    }
    if(max==0)//这里就是考虑全部为负数或者为0的情况
    {
        max=a[0];//假定第一个数是最大的
        for(i=1;i<len;i++)//如果后面的数有大于第一个数的就覆盖最大值
        {
            if(a[i]>max)
                max=a[i];
        }
    }
    printf("%d\n",max);
}
int main()
{   
    int len,a[]={1,-2,3,10,-4,7,2,-5};
    len=sizeof(a)/sizeof(a[1]);
    max(a,len);
    return 0;
}
[08:27:41] 

如果我们需要连同输出下标,只需要增加几个语句就可以了

[08:59:56] gcc sonarrysum.c 
[08:59:58] ./a.out
max:36 start: 0 end: 2 
11 12 13 
[08:59:59] cat sonarrysum.c 
#include<stdio.h>
void max(int a[],int len)
{
    int i,max=0,count=0,start=0,maxstart=0,end=0;
    for(i=0;i<len;i++)
    {
        count+=a[i];
        if(count<0)
        {
            count=0;
            start=i+1;//加1是因为a[i]这个数必定为负数,所以需要从下一个开始算
        }
        if(count>max)//注意这里只有找到了当前最大和时才确定开始和结束下标,maxstart才是最终的开始下标
        {
            max=count;
            end=i;
            maxstart=start;
        }
    }
    if(max==0)
    {
        max=a[0];
        maxstart=end=0;
        for(i=1;i<len;i++)
        {
            if(a[i]>max)
            {
                max=a[i];
                maxstart=end=i;
            }
        }
    }
    printf("max:%d start: %d end: %d \n",max,maxstart,end);
    for(i=maxstart;i<=end;i++)
        printf("%d ",a[i]);
    printf("\n");
}
int main()
{   
    int len,a[]={11,12,13,-44,-1,0,2,3};
    len=sizeof(a)/sizeof(a[1]);
    max(a,len);
    return 0;
}
[09:00:02] 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值