首页 > 其他 > 详细

求数组的所有子数组的和的最大值

时间:2014-03-17 05:46:09      阅读:433      评论:0      收藏:0      [点我收藏+]

题目描述:

输入一个整形数组,数组里有正数也有负数。 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值。要求时间复杂度为O(n)。

例如输入的数组为8,-4,6,-1,3,7,2,-3,和最大的子数组为8,-4,6,-1,3,7,2, 因此输出为该子数组的和21。

思路分析:

求一个数组的最大子数组和,如输入的数组为8,-4,6,-1,3,7,2,-3。由于要考虑到时间复杂度,即要尽量减少for的循环遍历次数,我和丹丹讨论了一下,想到了时间复杂度

为O(n)的算法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include<iostream.h>
int maxsum(int*a,int n)
{
    int sum=0;
    int c=0;
    for(int i=0;i<n;i++)
    {
        if(c<0)
            c=a[i];
        else
            c+=a[i];
        if(sum<c)
            sum=c;
    }
    return sum;
}
int main()
{
    int a[8]={8,-4,6,-1,3,7,2,-3};
    cout<<maxsum(a,8)<<endl;
    return 0;
}

  

运行结果如下:

bubuko.com,布布扣

考虑到数组全是负数的情况,我和丹丹又对程序做了一些改变:

bubuko.com,布布扣
bubuko.com,布布扣
#include <iostream.h>     
#define n 8 
int maxsum(int a[n])      
{    
int max=a[0];       //如果是全负情况,返回最大数     
int sum=0;    
for(int i=0;i<n;i++)    
{    
    if(sum>=0)     //如果加上某个元素,sum>=0的话,就加     
       sum+=a[i];    
   else       
      sum=a[i];  //如果加上某个元素,sum<0了,就不加     
    if(sum>max)    
         max=sum;    
  }    
   return max;    
}       
int main()    
{    
   int a[]={-8,-4,-6,-1,-5,-7,-2,-3};    
   cout<<maxsum(a)<<endl;    
   return 0;    
}    
bubuko.com,布布扣
bubuko.com,布布扣

运行结果:
bubuko.com,布布扣

以上是我们对求数组的所有子数组的和的最大值程序设计的探讨。

求数组的所有子数组的和的最大值,布布扣,bubuko.com

求数组的所有子数组的和的最大值

原文:http://www.cnblogs.com/hfxdaj/p/3603633.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!