zoukankan      html  css  js  c++  java
  • 数组中最大和的子数组

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

    [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
    ",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 
    ",max,maxstart,end);
        for(i=maxstart;i<=end;i++)
            printf("%d ",a[i]);
        printf("
    ");
    }
    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] 
    
  • 相关阅读:
    C语言II博客作业01
    C语言学期总结
    C语言I博客作业01
    C语言I博客作业09
    C语言I博客作业08
    C语言I博客作业07
    C语言I博客作业06
    First time homework
    C语言II博客作业04
    C语言II博客作业03
  • 原文地址:https://www.cnblogs.com/biaopei/p/7730641.html
Copyright © 2011-2022 走看看