现在的位置: 首页 > 综合 > 正文

子数组的最大和[算法]

2013年08月01日 ⁄ 综合 ⁄ 共 783字 ⁄ 字号 评论关闭

题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)例如输入的数组为1,
-2, 3, 10, -4, 7, 2, -5
,和最大的子数组为3, 10, -4, 7, 2,因此输出为该子数组的和18

要求最大的子数组的和.我们可以想象,当遍历到其中一个数A[i],如果A[i]之前的数组之和CurrentSum => 0,那么CurrentSum+A[i]=>A[i],那么最大值就应该在CurrentSum+A[i]和CurrentSum中取,因为A[i]有可能是正数也有可能是负数.因此用Sum来记录最终的最大值Sum=max(CurrentSum+A[i],CurrentSum),如果CurrentSum
< 0,则有CurrentSum+A[i] < A[i],所以,应该舍弃CurrentSum,用A[i]更新CurrentSum.

代码:

#include<iostream>
#include<Limits.h>
using namespace std;
int MaxArray(int* A,int n)
{
	int Sum=INT_MIN;
	int CurrentSum=0;
	for(int i=0;i<n;++i)
	{
		if(CurrentSum < 0)//如果i之前的和为负,则抛弃前边的,从A[i]开始统计新的和
			CurrentSum = A[i];
		else			//如果i之前的为正,则继续累加
			CurrentSum += A[i];
		if(Sum < CurrentSum)
			Sum=CurrentSum;
	}
	return Sum;
}
void main()
{
	int A[]={ -2,11, 11, 9, -7, -2, -5,-1};
	int len=sizeof(A)/sizeof(A[0]);
	cout<<MaxArray(A,len);
}

抱歉!评论已关闭.