贪心策略:累加数组的每个数字,同时用last保存上次的和。
当本次和小于0时,说明前面累加的数字再往后面加只会让后面的数字更小,因此舍弃前面这段和,将其赋为0;
当累加过程中,本次的和小于上一次的和,说明本次的和极有可能为最大值,保存下该值。
考虑整个数组都为负数的情况,连续子数组的最大和实际上就是最大的一个负数。
最后比较一下,last与mayResult,较大值为结果。
int FindGreatestSumOfSubArray(vector<int> array) {
int mayResult=array[0];
int sum=0;
int last=array[0];
int max=array[0];
bool isallminus=true;
for(int i=0;i<array.size();i++)
{
if(array[i]>0)
{
isallminus=false;
break;
}
if (array[i]>max) max=array[i];
}
if(isallminus) return max;
for(int i=0;i<array.size();i++)
{
sum+=array[i];
if (sum<0) sum=0;
if (sum<last && last>mayResult) mayResult=last;
last=sum;
}
if (last>mayResult) mayResult=last;
return mayResult;
}