求子数组的最大和

 

#include <iostream>   
using namespace std;
 
int maxSum(int* a, int n)  
{  
    int sum=0;  
    int b=0;       
    for(int i=0; i<n; i++)  
    {  
        if(b<0)           
            b=a[i];  
        else  
            b+=a[i];  
        if(sum<b)  
            sum=b;  
    }  
    return sum;  
} 

int maxSum1(int* a, int n)  
{  
    int sum=0;  
    int b=0;  
	int i=0;
    while(i<n)
	{
		sum+=a[i++];
		if (b<sum)
		{
			b=sum;
		}
		else if (sum<0)
		{
			sum=0;
		}
	}
    return b;  
} 

int maxSum2(int* a, int n)  
{  
    int sum;  
    int b=0;  
	int i=0, j;
    for (i=0; i<n; i++)
    {
		sum=0;
		for(j=i; j<n; j++)
		{
			sum+=a[j];
			if (b<sum)
			{
				b=sum;
			}
		}
    }
    return b;  
}     
  
int main()  
{  
    int a[10]={1, -2, 3, 10, -4, 7, 2, -5};    
    cout<<maxSum2(a,8)<<endl;  
    return 0;  
} 

 maxSum和maxSum1的时间复杂度都是O(n), maxSum2的时间复杂度是O(n^2).

maxSum算法设计

1、遍历数组中的每个元素进行累加,如果累加值小于0,则进行重新累加。

2、用变量sum保存每次累加值比sum的值。

maxSum2算法设计

1、依次从第一个节点遍历最后一个节点。

2、累加每次遍历的结果,用sum保存最大的值。

posted @ 2012-05-10 15:07  徐露  阅读(200)  评论(0编辑  收藏  举报