/*
欢迎大家交流
@mljde 2012.4.23
问题描述:
在一个数组中,里面有正数也有负数,求里面子数组的最大和问题,要求时间复杂度为O(n)
算法思想:
对数组中的元素逐个求和(sum),如果和为正数,则为最大和(max),然后接着求和,如果和(sum)
大于最大和(max),则对max更新为sum。如果sum为负数,则sum = 0;
*/
#include <iostream>
using namespace std;void main()
{
//sum为子数组的和
int sum = 0;
//max为子数组的最大和
int max = 0;
//最大子数组的起始位置
int startPos = 0;
//最大子数组的结束位置
int endPos = 0;
int array[] = {-1,2,-3,12,-5, -1, -2};
//求数组的长度
cout<<sizeof(array)/sizeof(int)<<endl;int length = sizeof(array)/sizeof(int);
for(int i=0;i<length;i++)
{
sum += array[i];
if(sum<0)
{
sum = 0;
startPos = i+1;
}
if(sum>max)
{
max = sum;
endPos = i+1;
}
}
cout<<max<<endl;
cout<<startPos<<" "<<endPos<<endl;
}