数组中最大和的子数组

来源:互联网 发布:php 判断整数 编辑:程序博客网 时间:2024/05/22 08:04

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

[08:27:34] gcc sonarrysum.c [08:27:37] ./a.out18[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.outmax: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] 
原创粉丝点击